Class A
{
public:
int a;
CString str;
CStringArray aStr;
};
Class B
{
public:
CArray<A,A&> Array;//параметр по ссылке
InitA();//функция инициализации Array
};
B::InitA()
{
A TempA;
TempA.a=11;
TempA.str="строка";
TempA.aStr[0]="aaaaaa";
Array.Add(TempA);//добавляем объект вроде по ссылке значит без присваивания
//а выдает ошибку
}
Ошибка: error C2248: 'CObject::operator =' : cannot access private member declared in
Ситуация примерно такая:
Class A
{
public:
CStringArray aStr;
};
Class B
{
CArray<A,A&> Array;
};
При компиляции происходит ошибка: error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'.
Смысл ее я примерно понимаю- где-то происходит присваивание(или должно быть при передаче по значению в функцию) объекта CStringArray, но мы не можем это сделать,так как CStringArray производный от CObject' в котором operator= не доступен(private).
Вопрос: Как можно сделать членом класса коллекцию CArray элементами которого являются объекты производные от CObject? И где все-таки происходит присваивание в описанном выше случае?
если посмотреть под другим углом, то в данном случае лучше хранить не "массив объектов А", а "массив указателей на объекты А". тогда мы избежим многократного копирования нашего CStringArray в самом классе A. кроме того, это избавит нас от необходимости писать конструктор копирования
Используя MFC мы можем применять различные скажем так "типы" массивов. Может есть какие -то рекомендации где, когда и какие применять? Какими пользуетесь вы например?
стараюсь не пользоваться MFC, STL более предпочтительнее
Цитата: vAC
стараюсь не пользоваться MFC, STL более предпочтительнее
А как это относиться к теме вопроса?
Дело в том что ошибка error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject', как я понял, иногда (на самом деле когда-вот в чем вопрос) происходит при применении объектов классы которых производные от CObject. В частности CArray,CStringArray и другие коллекции. Одним из решений применение других коллекций, в том числе и из STL.
Я решил добавить немножко больше импровизированного кода:
Код:
Если убираешь CStringArray aStr из А- компилируется нормально.
Если переопределять operator= то в каком классе? И единственный ли это выход?
Компилятор тебе сообщает, что operator= определен в CObject как приватный.
Переопределить ты его можешь, как в классе наследуемом от CStringArray, т.е. создай свой контейнер, либо в твоем классе A и там скопируй контейнер, либо используй STL-контейнер вместо CStringArray.
В книге Джорджа Шеперда "Программирование на Visual C++", написано "Класс элемента CArray не должен быть производным от CObject...", а как же тогда CStringArray и другие? Вопрос к уважаемым гуру такой: Как создавая свой контейнер, производный от CStringArray, лучше всего и эффективно переопределить в public: 'CObject::operator ='?
Я бы не создавал контейнер производный от CStringArray, а использовал бы STL-контейнер. Если же CStringArray предоставляет нечто большее, чем просто контейнер аналог STL-ким, то определил бы конструктор копирования и оператор присваивания в классе A.