• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Ошибка: Error C2248: 'cobject::operator =' : Cannot Access Pri

  • Автор темы v_klad
  • Дата начала
Статус
Закрыто для дальнейших ответов.
V

v_klad

Здравствуйте.
Ситуация примерно такая:
Class A
{
public:
CStringArray aStr;
};

Class B
{
CArray<A,A&> Array;
};

При компиляции происходит ошибка: error C2248: 'CObject::eek:perator =' : cannot access private member declared in class 'CObject'.
Смысл ее я примерно понимаю- где-то происходит присваивание(или должно быть при передаче по значению в функцию) объекта CStringArray, но мы не можем это сделать,так как CStringArray производный от CObject' в котором operator= не доступен(private).
Вопрос: Как можно сделать членом класса коллекцию CArray элементами которого являются объекты производные от CObject? И где все-таки происходит присваивание в описанном выше случае?
 
G

grigsoft

Присваивание происходит внутри CArray, для объектов массива, в твоем случае для А, а не для CStringArray. Так что думаю что на самом деле А все-таки от CObject наследуется. Как сделать? Определять свой operator=.
 
V

v_klad

Могу ошибаться, но ядумаю, что при создании объектов присваивания не происходит.
Тогда немножко больше импровизированного кода:
Код:
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);//добавляем объект вроде по ссылке значит без присваивания
//а выдает ошибку 	
}
Если убираешь CStringArray aStr из А- компилируется нормально.
Если переопределять operator= то в каком классе? И единственный ли это выход?
 
G

grigsoft

А тут не надо думать - используя MFC надо смотреть исходный код. Загляни в afxtempl.h и все увидишь. Присваивание вызывается для копирования объектов при расширении массива. Далее, CArray хранит объекты указанные в первом параметре темплейта, так в твоем случае копия все равно создается. Но это не важно, наличие operator= требуется для компиляции CArray<T, T>, даже если вы ничего в него добавлять не будете. Просто для несложных составных типов компилятор сам создает operator=. А в CStringArray operator= не определен, как его копировать - непонятно.
operator= нужен в том классе, который хранится в массиве. Альтернатива - хранить в массиве указатели, определяя как CArray<A*,A*>
 
V

v_klad

grigsoft
Спасибо за ответ.
Тогда вопрос как лучше всего переопределить operator= для CStringArray?
И большая ли разница при применении CTypedPtrArray<CObArray, A*> или CArray<A*,A*> ?
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!