Инициализация ctor подкласса - PullRequest
0 голосов
/ 07 июля 2011
struct A {
    B b;
    A(int x):b(x){}
    A(int x, float g) // how to implement this? I want to init b as a C. 
};
struct B {
    enum {e_c, e_d} type;
    int i;
    B(int i_):i(i_){}
};
struct C : public B {
    float f;
    C(int i_, float f_):B(i),f(f_){}
};
struct D : public B {
    double ff;
    D(int i_, double d):B(i),ff(d){}
};

Может быть, есть другой способ закодировать это? Первоначально у меня был только класс B, но я решил разделить его, чтобы я не продолжал добавлять (несовместимые / взаимоисключающие) поля в B. Мое решение было, когда A использует b, он проверяет перечисление b, чтобы увидеть, какой это тип. , затем бросает B * к C * или D *, чтобы получить число с плавающей или двойной. Моя проблема в том, что теперь я не знаю, как позволить инициализировать A b. Позволяет ли мне язык делать что-то подобное?

edit : Я только что понял, что буква А не могла бы выделить место для дополнительных полей С или D. Там не было бы свободного места для хранения поплавка или двойной. Итак, я думаю, что правильный способ сделать то, что я хочу, это добавить в B a union {float f; double ff;};?

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Ваш пример немного запутан.Но, возможно, вам нужен указатель?

struct A {
    B *b;
    A(int x):b(new B(x)) {}
    A(int x, float g):b(new C(x,g)) {}
   ~A() { delete b; }  // Very important!
};

Обратите внимание, что если вы сделаете это, B должен иметь виртуальный деструктор.Вам также нужно подумать о том, что значит скопировать объект A.

1 голос
/ 07 июля 2011

Ваше редактирование правильное.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...