Проблема с переопределением конструктора
От: SVV Беларусь  
Дата: 02.01.03 10:34
Оценка:
Привет, всем.

Есть такой код:
class CA
{
public:
    CA(HWND){};
};

class CB : public CA
{
public:
    CB(HWND)
    {
        CA::CA ((HWND)0);// Этой строки может и не быть
    };
};


В результате ошибка компиллятора: error C2512: 'CA' : no appropriate default constructor available
Ошибка пропадает, если использовать конструкторы без параметров (или только СА без параметров). Как правильно переопределить конструкторы с параметрами?
Re: Проблема с переопределением конструктора
От: Bell Россия  
Дата: 02.01.03 10:41
Оценка: 3 (1)
Здравствуйте, SVV, Вы писали:

...


class CB : public CA
{
public:
   CB(HWND handle = (HWND)0) : CA(handle) { /*...*/ }

};
Любите книгу — источник знаний (с) М.Горький
Re: Проблема с переопределением конструктора
От: Dima_Ch Беларусь  
Дата: 02.01.03 10:46
Оценка: 3 (1)
Здравствуйте, SVV, Вы писали:

SVV>Привет, всем.


SVV>Есть такой код:

SVV>
SVV>class CA
SVV>{
SVV>public:
SVV>    CA(HWND){};
SVV>};

SVV>class CB : public CA
SVV>{
SVV>public:
SVV>    CB(HWND):CA ((HWND)0);// А такую неплохо бы и добавить
SVV>    {
SVV>//        CA::CA ((HWND)0);// Этой строки может и не быть и не надо 
SVV>    };
SVV>};
SVV>


При создании производного класса вызывается конструктор производного класса , если не указан явно, то берется конструктор по умолчанию, иначе нужно явно указывать какой конструктор вызывать

class A{
      A()
    {
    } 
};
class B()
{
    B() : A()  // можно A() не указывать явно
    {} 
}


SVV>В результате ошибка компиллятора: error C2512: 'CA' : no appropriate default constructor available

SVV>Ошибка пропадает, если использовать конструкторы без параметров (или только СА без параметров). Как правильно переопределить конструкторы с параметрами?
Re[2]: Проблема с переопределением конструктора
От: SVV Беларусь  
Дата: 02.01.03 10:51
Оценка:
Спасибо.
Компиллятор уже поборол. Сейчас буду выяснять правильно ли это работает.
Re[2]: Проблема с переопределением конструктора
От: SVV Беларусь  
Дата: 02.01.03 10:51
Оценка:
Спасибо.
Компиллятор уже поборол. Сейчас буду выяснять правильно ли это работает.

23.01.03 18:42: Перенесено из 'Мусор'
Re[3]: Проблема с переопределением конструктора
От: Bell Россия  
Дата: 02.01.03 10:59
Оценка: 1 (1)
Здравствуйте, SVV, Вы писали:

SVV>Спасибо.

SVV>Компиллятор уже поборол. Сейчас буду выяснять правильно ли это работает.
Борьба с компилятором до добра не доведет
С компилятором надо по-хорошему...
Любите книгу — источник знаний (с) М.Горький
Re[4]: Проблема с переопределением конструктора
От: SVV Беларусь  
Дата: 02.01.03 11:11
Оценка:
Здравствуйте, Bell, Вы писали:


B>Борьба с компилятором до добра не доведет

Согласен.
B>С компилятором надо по-хорошему...
А двоеточие означает что конструктор СВ наследует код CA, или всего лишь определяет какой базовый конструктор вызывать, если явного вызова не будет?
Re[5]: Проблема с переопределением конструктора
От: Bell Россия  
Дата: 02.01.03 11:23
Оценка: 2 (1)
Здравствуйте, SVV, Вы писали:
...

SVV>А двоеточие означает что конструктор СВ наследует код CA

ни в коем случае (см. ниже)

SVV>... или всего лишь определяет какой базовый конструктор вызывать


После двоеточя идет так называемый список инициализации. В этом списке в том числе можно указывать какой именно конструктор базового класса нужно вызвать

SVV> ...если явного вызова не будет?

Если явного вызова не будет, то компилятор попробует вызвать констуктор по умолчанию. В случае отсутствия констуктора по умолчанию возникнет ошибка (в чем ты уже убедился)

ЗЫ
констуктор по умолчанию — это констркутор без параметров, или с параметрами, имеющими значения по умолчанию.
Любите книгу — источник знаний (с) М.Горький
Re: Проблема с переопределением конструктора
От: Vladimir Bezugliy Украина  
Дата: 02.01.03 13:07
Оценка: 2 (1)
class CA
{
public:
   CA(HWND h){};
};

class CB : public CA
{
public:
   CB(HWND h)
   {
      CA::CA ((HWND)0);// Этой строки может и не быть
   };
};


...
void main()
{
CB bl;
}

SVV>В результате ошибка компиллятора: error C2512: 'CA' : no appropriate default constructor available

SVV>Ошибка пропадает, если использовать конструкторы без параметров (или только СА без параметров).
SVV>Как правильно переопределить конструкторы с параметрами?

Когда ты создаешь объект у которого есть базовые классы — то сначала вызываются конструкторы для базовых классов, а потом конструктор для самого объекта.
То что ты вызываешь конструктор для СА внутри CB ничего не значит для компилятора.
И вообще
CA::CA ((HWND)0);
— это ты просто создал временный объект CA, который будет уничтожен после выхода из конструктора.
Компилятор сам пытается вызвать конструктор по умолчанию для СА. А такого просто нет — вот он и ругается.
Нужно писать вот так:
CB():CA()
{
...
}

Этим ты говоришь, что перед выполнением конструктора CB нужно выполнить конструктор CA.

Владимир Безуглый.
... << RSDN@Home 1.0 beta 3 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.