Как я могу инициализировать параметры суперкласса из дочернего c-tor в C ++? - PullRequest
2 голосов
/ 15 ноября 2010

Посмотрите следующий пример:

class A {
public:
    A(int param1, int param2, int param3) {
        // ...
    }
};

class B : public A {
public:
    B() : m_param1(1), m_param(2), m_param(3), A(m_param1, m_param2, m_param3) {
        // ...
    }
};

B b;

Очевидно, что при создании «b» будет вызываться ctor A перед инициализацией параметров B.

Это правило запрещаетя от создания классов-оболочек, которые упрощают инициализацию класса.

Каков "правильный путь" для этого?

Спасибо, Амир

PS: В частностиВ этом случае параметры не являются примитивами, этот пример просто помог мне объяснить.

Ответы [ 3 ]

4 голосов
/ 15 ноября 2010

Просто вызовите конструктор А:

class B : public A
{
public:
    B() : A(1 ,2, 3)
    {
    }; // eo ctor
}; // eo class B

EDIT:

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

class Object
{
private:
    int i;
public:
    Object(int _i) : i(_i){};
};

class A
{
public:
    A(Object* _1, Object* _2, Object* _3)
    {
    };
};

class B : public A
{
private:
    Object* _1;
    Object* _2;
    Object* _3;

public:
    B() : A(_1 = new Object(1), _2 = new Object(2), _3 = new Object(3))
    {
    };
};
2 голосов
/ 15 ноября 2010

«Параметры не являются примитивами».Итак, у вас есть что-то вроде этого?

class Param { /*...*/ };
class A {
public:
  A(const Param& param1, const Param& param2, const Param& param3);
};

class B : public A {
public:
  B();
private:
  Param m_param1;
  Param m_param2;
  Param m_param3;
};

И вы хотите передать элементы B конструктору A.Как насчет этого?

class B_params {
protected:
  B_params(int v1, int v2, int v3);
  Param m_param1;
  Param m_param2;
  Param m_param3;
};
class B : private B_params, public A {
public:
  B();
};

B_params::B_params(int v1, int v2, int v3)
  : m_param1(v1), m_param2(v2), m_param3(v3) {}
B::B() : B_params(1,2,3), A(m_param1, m_param2, m_param3) {}

Просто убедитесь, что B_params стоит перед A в списке унаследованных B классов.

0 голосов
/ 15 ноября 2010

Не уверен, что я получаю ваш вопрос.

Если вы просто хотите что-то, что поможет вам инициализировать A с некоторыми заданными параметрами, вам следует использовать конструктор A со значениями по умолчанию:

class A {
public:
    A(int param1 = 1, int param2 = 2, int param3 =3) {
        // ...
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...