Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / В качестве параметра конструктора указатель на сам объект / 12 сообщений из 12, страница 1 из 1
25.05.2015, 17:02
    #38968052
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
Класс А (точнее его потомки) оперируют указателем на объекты типа Х, получая его как параметр конструктора.
В тоже время класс B, реализующий оба интерфейса должен в качестве этого параметра получить самого себя.
Данный код корректен?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
25.05.2015, 19:11
    #38968145
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
А откуда в твоем B, А сможет получить X?

И вообще, если A уже имеет X в качестве поля, зачем делать X предком B?
Намного проще будет:
Код: plaintext
1.
2.
3.
class B: public A {
   B(X):A(X) {}
}
...
Рейтинг: 0 / 0
25.05.2015, 20:49
    #38968206
YesSql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
NafКласс А (точнее его потомки) оперируют указателем на объекты типа Х, получая его как параметр конструктора.
В тоже время класс B, реализующий оба интерфейса должен в качестве этого параметра получить самого себя.
Данный код корректен?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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% задач.
...
Рейтинг: 0 / 0
25.05.2015, 21:04
    #38968215
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
YesSqlМожно, если не использовать X в конструкторе А.
Почему? Он же вызывается уже после того, как Х полностью сформирован.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.05.2015, 09:53
    #38968358
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
спасибо, решил сделать "более абстрактными"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class X
{
};

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

class B: public X, public A
{
public:
    X* getX(){return this;}
};
...
Рейтинг: 0 / 0
26.05.2015, 12:37
    #38968565
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
Naf,

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

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


На самом деле это правиль нестрогое, иногда можно испльзовать этот X и в конструкторе, и в деструкторе,
вопрос только -- в каком конструкторе, и в каком его месте.
Формальное требование одно -- объект X должен быть валидным на момент использования, т.е. полнстью инициализированным.
...
Рейтинг: 0 / 0
26.05.2015, 12:40
    #38968575
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
Nafспасибо, решил сделать "более абстрактными"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class X
{
};

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

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



А это не больно поможет, потому что в конструкторе A будет вызываться A::getX().
А если не в конструкторе, то бессмысленно делать геттер на ссылку.
Хотя, это может быть полезно, если это поле должно быть и в интерфейсе класса.
...
Рейтинг: 0 / 0
26.05.2015, 13:02
    #38968614
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
MasterZivобъект X должен быть валидным на момент использования, т.е. полнстью
инициализированным.
А ты можешь привести пример, когда при объявлении
Код: sql
1.
class B: public X, public A


конструктор А вызовется раньше, чем объект Х полностью проинициализируется?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.05.2015, 13:24
    #38968637
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
не, не в конструкторе/деструкторе этот Х не используется
...
Рейтинг: 0 / 0
26.05.2015, 14:23
    #38968718
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
Dimitry SibiryakovMasterZivобъект X должен быть валидным на момент использования, т.е. полнстью
инициализированным.
А ты можешь привести пример, когда при объявлении
Код: sql
1.
class B: public X, public A


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


Так а практически всегда, при использовании в X виртуальных функций, переопределённых в B.
...
Рейтинг: 0 / 0
26.05.2015, 14:30
    #38968741
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В качестве параметра конструктора указатель на сам объект
MasterZivDimitry Sibiryakovпропущено...

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


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


Так а практически всегда, при использовании в X виртуальных функций, переопределённых в B.Что? Поподробнее можно
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / В качестве параметра конструктора указатель на сам объект / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]