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[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 >>
Re[3]: Проблема с переопределением конструктора
От: Bell Россия  
Дата: 02.01.03 10:59
Оценка: 1 (1)
Здравствуйте, SVV, Вы писали:

SVV>Спасибо.

SVV>Компиллятор уже поборол. Сейчас буду выяснять правильно ли это работает.
Борьба с компилятором до добра не доведет
С компилятором надо по-хорошему...
Любите книгу — источник знаний (с) М.Горький
Проблема с переопределением конструктора
От: 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[2]: Проблема с переопределением конструктора
От: SVV Беларусь  
Дата: 02.01.03 10:51
Оценка:
Спасибо.
Компиллятор уже поборол. Сейчас буду выяснять правильно ли это работает.
Re[2]: Проблема с переопределением конструктора
От: SVV Беларусь  
Дата: 02.01.03 10:51
Оценка:
Спасибо.
Компиллятор уже поборол. Сейчас буду выяснять правильно ли это работает.

23.01.03 18:42: Перенесено из 'Мусор'
Re[4]: Проблема с переопределением конструктора
От: SVV Беларусь  
Дата: 02.01.03 11:11
Оценка:
Здравствуйте, Bell, Вы писали:


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

Согласен.
B>С компилятором надо по-хорошему...
А двоеточие означает что конструктор СВ наследует код CA, или всего лишь определяет какой базовый конструктор вызывать, если явного вызова не будет?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.