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

Тема в разделе "MS Visual C++", создана пользователем v_klad, 27 окт 2007.

Статус темы:
Закрыта.
  1. v_klad

    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? И где все-таки происходит присваивание в описанном выше случае?
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Присваивание происходит внутри CArray, для объектов массива, в твоем случае для А, а не для CStringArray. Так что думаю что на самом деле А все-таки от CObject наследуется. Как сделать? Определять свой operator=.
     
  3. v_klad

    v_klad Гость

    Могу ошибаться, но ядумаю, что при создании объектов присваивания не происходит.
    Тогда немножко больше импровизированного кода:
    Код (Text):
    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= то в каком классе? И единственный ли это выход?
     
  4. grigsoft

    grigsoft Well-Known Member

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

    v_klad Гость

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

Поделиться этой страницей