Конструктор без пераметров
От: Wo-o-olf Россия  
Дата: 05.12.05 14:24
Оценка:
Есть примерно такое:


// file: item.h

class Item
{
protected:    // interface

    Item(int uii, Item * pParent = 0)
    {
        m_uiiID = uii;
        m_pParent = pParent;
    }

public:

    virtual ~Item() {};

private:    // hidden interface

    Item(); /* !!!!!! */

    Item(const Item & ) {};

private:

    int        m_uiiID;
    Item *      m_pParent;

};

// file: control.h


class Control
:   virtual public Item
{
public:

    Control(); //: Item(10) {}

    Control(Item * pParent); // : Item(10, pParent) {}

    virtual ~Control();

};

// file: control.cpp

Control::Control()
:   Item(10)
{}

Control::Control(Item * pParent)
:   Item(10, pParent)
{}

Control::~Control() {}

// file: main.cpp

void main()
{
    Control ctrl;
}


В таком варианте не компилируется (vc71):
error C2248: 'Item::Item' : cannot access private member declared in class 'Item'
...\item.h(37) : see declaration of 'Item::Item'
...\item.h(22) : see declaration of 'Item'

Вариантов два — закомментировать строку в классе Item помеченную восклицательными знаками

ЛИБО!!!

перенести объявления коеструкторов класса Control в h-ник (сейчас закоментарено).

Оба, тем не менее, мне не нравятся, т.к. я этого не понимаю

Есть идеи как это обозвать и как решить?
Re: Конструктор без пераметров
От: VadimB Россия  
Дата: 05.12.05 14:30
Оценка:
Здравствуйте, Wo-o-olf, Вы писали:

WOO>Есть примерно такое:


WOO>protected: // interface


WOO> Item(int uii, Item * pParent = 0)

WOO> {

Это сделано для того, что бы ты мог создать экземпляр класса вызвал только этот конструктор. И обходить это не рекомендуется ))) Может нарушится логика работы класса
Re: Конструктор без пераметров
От: Lorenzo_LAMAS  
Дата: 05.12.05 14:34
Оценка:
Приведенный тобой код не должен приводить к такой ошибке. Код точно такой?
Of course, the code must be complete enough to compile and link.
Re[2]: Конструктор без пераметров
От: Wo-o-olf Россия  
Дата: 05.12.05 14:55
Оценка:
Здравствуйте, VadimB, Вы писали:

VB>Это сделано для того, что бы ты мог создать экземпляр класса вызвал только этот конструктор. И обходить это не рекомендуется ))) Может нарушится логика работы класса


Я знаю это я делал

Именно для этого и пытался явно спрятать конструктор по умолчанию Item

Вопрос немного не в этом
Re[2]: Конструктор без пераметров
От: Wo-o-olf Россия  
Дата: 05.12.05 14:56
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Приведенный тобой код не должен приводить к такой ошибке. Код точно такой?


Абсолютно. Ещё раз проверено обратным копированием.

зыж gcc 3.3.4 не издаёт ни писка во время компиляции этого счастья
Re[2]: Конструктор без пераметров
От: Bell Россия  
Дата: 05.12.05 15:30
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Приведенный тобой код не должен приводить к такой ошибке. Код точно такой?

На VC7.1 все именно так, как описАл Wo-o-olf. Причем, если убрать виртуальное наследование, то все компилируется
Любите книгу — источник знаний (с) М.Горький
Re[3]: Конструктор без пераметров
От: Wo-o-olf Россия  
Дата: 05.12.05 15:39
Оценка:
Здравствуйте, Bell, Вы писали:


B>На VC7.1 все именно так, как описАл Wo-o-olf. Причем, если убрать виртуальное наследование, то все компилируется


Убирать не предлагать так нада
Re: Конструктор без пераметров
От: Wo-o-olf Россия  
Дата: 06.12.05 10:20
Оценка:
Сойдёмся на том, что это бага компилера?
Re[2]: Конструктор без пераметров
От: Bell Россия  
Дата: 06.12.05 10:24
Оценка:
Здравствуйте, Wo-o-olf, Вы писали:


WOO>Сойдёмся на том, что это бага компилера?

Так это с самого начала понятно было...
Интересно было бы проверить на VS2005, и если ошибка там не исчезнет, то можешь слать bug-report.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.