В качестве параметра конструктора указатель на сам объект

Naf
Дата: 25.05.2015 17:02:03
Класс А (точнее его потомки) оперируют указателем на объекты типа Х, получая его как параметр конструктора.
В тоже время класс B, реализующий оба интерфейса должен в качестве этого параметра получить самого себя.
Данный код корректен?
class X
{
};

class A //хранит указатель на X
{
public:
    A(X* x):x(x) {} 
private:
    X* x;
};

class B: public X, public A //хранит указатель на себя
{
public:
    B():X(),A(this) {}
};

С уважением, Naf
White Owl
Дата: 25.05.2015 19:11:49
А откуда в твоем B, А сможет получить X?

И вообще, если A уже имеет X в качестве поля, зачем делать X предком B?
Намного проще будет:
class B: public A {
   B(X):A(X) {}
}
YesSql
Дата: 25.05.2015 20:49:03
Naf
Класс А (точнее его потомки) оперируют указателем на объекты типа Х, получая его как параметр конструктора.
В тоже время класс B, реализующий оба интерфейса должен в качестве этого параметра получить самого себя.
Данный код корректен?
class X
{
};

class A //хранит указатель на X
{
public:
    A(X* x):x(x) {} 
private:
    X* x;
};

class B: public X, public A //хранит указатель на себя
{
public:
    B():X(),A(this) {}
};

С уважением, Naf


Можно, если не использовать X в конструкторе А. Но я бы еще раз подумал над дизайном. Множественное наследование классов (не интерфейсов) не требуется в 99.99% задач.
Dimitry Sibiryakov
Дата: 25.05.2015 21:04:14

YesSql
Можно, если не использовать X в конструкторе А.

Почему? Он же вызывается уже после того, как Х полностью сформирован.

Posted via ActualForum NNTP Server 1.5

Naf
Дата: 26.05.2015 09:53:35
спасибо, решил сделать "более абстрактными"
class X
{
};

class A
{
public:
    virtual X* getX()=0;
};

class B: public X, public A
{
public:
    X* getX(){return this;}
};
MasterZiv
Дата: 26.05.2015 12:37:03
Naf,

Данный код корректен?

Да, корректен.
Но есть маленький нюанс -- здесь нет использования этого объекта
X* x;
в коде.
Так вот, в момент, когда он будет использован, указатель должен ссылаться на валидный и полнстью сконструированный объект класса X.
В таком случае всё будет ОК.
(на всякий случай подчеркну -- в конструкторах и деструкторах как правило этот x будет использовать нельзя).
MasterZiv
Дата: 26.05.2015 12:39:06
Можно, если не использовать X в конструкторе А.


На самом деле это правиль нестрогое, иногда можно испльзовать этот X и в конструкторе, и в деструкторе,
вопрос только -- в каком конструкторе, и в каком его месте.
Формальное требование одно -- объект X должен быть валидным на момент использования, т.е. полнстью инициализированным.
MasterZiv
Дата: 26.05.2015 12:40:21
Naf
спасибо, решил сделать "более абстрактными"
class X
{
};

class A
{
public:
    virtual X* getX()=0;
};

class B: public X, public A
{
public:
    X* getX(){return this;}
};


А это не больно поможет, потому что в конструкторе A будет вызываться A::getX().
А если не в конструкторе, то бессмысленно делать геттер на ссылку.
Хотя, это может быть полезно, если это поле должно быть и в интерфейсе класса.
Dimitry Sibiryakov
Дата: 26.05.2015 13:02:51

MasterZiv
объект X должен быть валидным на момент использования, т.е. полнстью
инициализированным.

А ты можешь привести пример, когда при объявлении
class B: public X, public A

конструктор А вызовется раньше, чем объект Х полностью проинициализируется?

Posted via ActualForum NNTP Server 1.5

Naf
Дата: 26.05.2015 13:24:48
не, не в конструкторе/деструкторе этот Х не используется