Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Создание нового объекта когда неизвестен тип


Автор: Royan 26.11.2005, 17:17
Всем привет,

Напомните, пожалуйста, что я делаю не так вот куски моего кода:

Код

//CObj.h
class CObj {

public:
    CObj();
    virtual ~CObj();

    void operator= (const CObj& _Right) {
        if (this != &_Right) {
           //copy here
        }
        return *this;
    }

    /* Есть еще такой вариант */
    //CObj&  CObj::operator =(const CObj& _Right) {
    //    if (this != &_Right) {
    //        
    //    }
    //    return *this;
    //}
};


Код

//CLayer.h
template <typename _Ty>
class CLayer {

public:
        CLayer(unsigned int neuronsNum)
        : objArr(NULL)
        {           
            for(unsigned int i = 0; i < neuronsNum; i++) {
                objArr[i] = new _Ty();                
            }
        };
    
    ~CLayer() {
        delete [] objArr;
    };

    private:  
    _Ty *objArr;
};


Код

//Какой-то cpp

CLayer<CObj> layer = CLayer<CObj>(2);


Получаю вот такую ошибку:

Цитата
d:\...\CLayer.h(30) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'CObj *' (or there is no acceptable conversion)
        d:\...\CLayer.h(26) : while compiling class-template member function 'CLayer<_Ty>::CLayer(unsigned int)'
        with
        [
            _Ty=CObj
        ]
        d:\...\main.cpp(25) : see reference to class template instantiation 'CLayer<_Ty>' being compiled
        with
        [
            _Ty=CObj
        ]

Автор: Void 26.11.2005, 17:23
Royan
Оператор присваивания не наследуется. Определи его в CLayer снова.

Автор: Guest 26.11.2005, 18:16
Не понимаю, как такая строчка вообще компилируется:

Код

 objArr[i] = new _Ty();


Насколько я понимаю, _Ty - это СObj, значит objArr либо просто указатель на _Ty, либо указатель на массив объектов _Ty. Значит objArr[i] либо вообще некорректно, либо возвращает ссылку на i-ый объект _Ty, но new _Ty() возвращает _Ty*, так что в случае _Ty* objArr присваивание некорректно. Нужно сделать _Ty** objArr, либо

Код

_Ty object;
objArr[i]=object;


И все равно не понятно, где в коде создаются neuronsNum объектов _Ty

Автор: Royan 26.11.2005, 18:26
Void, на самом деле эти два класса независимы.

Guest, кем бы ты ни был ты оказался прав. Действительно я значально не понял "что" я получаю оператором new. Спасибо!

Автор: Void 26.11.2005, 18:29
Royan
Извиняюсь, читал по диагонали.

Автор: LPBOY 26.11.2005, 19:42
Цитата(Void @ 26.11.2005, 17:23)
Оператор присваивания не наследуется.

Почему не наследуется?

Автор: Void 26.11.2005, 19:47
LPBOY
Если быть точным в формулировках, то он всегда скрывается оператором присваивания класса-наследника, явным или неявным. (13.5.3/1)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)