Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка: error C2248: 'CObject::operator =' : cannot access private member declared in

31K
27 октября 2007 года
v_klad
7 / / 27.10.2007
Здравствуйте.
Ситуация примерно такая:
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? И где все-таки происходит присваивание в описанном выше случае?
355
27 октября 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
проблема в том, что при помещении в B::Array объекта класса A, происходит копирование этого объекта. В случае простых типов компилятор разгребает это дело сам, но если в полях класса А присутствуют объекты других классов, то они должны иметь конструктор копирования.
если посмотреть под другим углом, то в данном случае лучше хранить не "массив объектов А", а "массив указателей на объекты А". тогда мы избежим многократного копирования нашего CStringArray в самом классе A. кроме того, это избавит нас от необходимости писать конструктор копирования
31K
27 октября 2007 года
v_klad
7 / / 27.10.2007
Спасибо за ответ. Если вы имеете ввиду CTypedPtrArray то надо попробовать. Вообще как я понял эти коллекции MFC не так уж и просты.
Используя MFC мы можем применять различные скажем так "типы" массивов. Может есть какие -то рекомендации где, когда и какие применять? Какими пользуетесь вы например?
505
28 октября 2007 года
vAC
343 / / 28.02.2006
стараюсь не пользоваться MFC, STL более предпочтительнее
3
28 октября 2007 года
Green
4.8K / / 20.01.2000
Цитата: vAC
стараюсь не пользоваться MFC, STL более предпочтительнее


А как это относиться к теме вопроса?

31K
28 октября 2007 года
v_klad
7 / / 27.10.2007
Это был ответ на мой вопрос.
Дело в том что ошибка error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject', как я понял, иногда (на самом деле когда-вот в чем вопрос) происходит при применении объектов классы которых производные от CObject. В частности CArray,CStringArray и другие коллекции. Одним из решений применение других коллекций, в том числе и из STL.
Я решил добавить немножко больше импровизированного кода:
Код:
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= то в каком классе? И единственный ли это выход?
3
28 октября 2007 года
Green
4.8K / / 20.01.2000
Любые коллекции, будь то MFC или STL, требуют наличие оператора =, дефолтового или переопределенного.
Компилятор тебе сообщает, что operator= определен в CObject как приватный.
Переопределить ты его можешь, как в классе наследуемом от CStringArray, т.е. создай свой контейнер, либо в твоем классе A и там скопируй контейнер, либо используй STL-контейнер вместо CStringArray.
31K
28 октября 2007 года
v_klad
7 / / 27.10.2007
Так значит переопределить 'CObject::operator =' - это единственный выход? Так почему же об этом нигде блин не пишут?
В книге Джорджа Шеперда "Программирование на Visual C++", написано "Класс элемента CArray не должен быть производным от CObject...", а как же тогда CStringArray и другие? Вопрос к уважаемым гуру такой: Как создавая свой контейнер, производный от CStringArray, лучше всего и эффективно переопределить в public: 'CObject::operator ='?
3
28 октября 2007 года
Green
4.8K / / 20.01.2000
Я бы не создавал контейнер производный от CStringArray, а использовал бы STL-контейнер. Если же CStringArray предоставляет нечто большее, чем просто контейнер аналог STL-ким, то определил бы конструктор копирования и оператор присваивания в классе A.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог