Проблема с объявлением / инициализацией объекта как частного члена в другом классе - PullRequest
1 голос
/ 14 марта 2011

Извините, если об этом уже спрашивали, похоже, я ничего не могу найти. Я не уверен, как искать это.

У меня есть что-то вроде этого:

class A {
    private:
        int x;
        int y;
    public:
        A(int, int);
}

class B {
    private:
        A a(3, 4); // Doesn't compile because of this line
    public:
        B();
}

Единственный способ решить эту проблему - сделать a указателем на A и затем a = new A(3, 4); внутри конструктора B. Но я не хочу, чтобы a был указателем.

Как правильно решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 14 марта 2011

Вы помечаете конструктор B "списком инициализации члена".Вместо:

B::B() {
    ...
}

Вы делаете это:

B::B() : a(3, 4) {
    ...
}

Или, если конструктор определен в заголовке:

class B {
    private:
        A a;
    public:
        B() : a(3, 4) {
            ...
        }
};
2 голосов
/ 14 марта 2011
class B {
    private:
        A a;
    public:
        B() : a(3,4) {}
};

В более широком смысле, решение состоит в том, чтобы выучить C ++, прочитав книгу об этом . Да, это странно, но смысл учебников в том, что они вводят понятия в разумном порядке, и когда они рассказывают вам о членах данных, они одновременно сообщают вам, как их инициализировать.

0 голосов
/ 14 марта 2011

Если вы хотите, чтобы B.a была инициализирована с аргументами 3 и 4, то вы делаете это в конструкторе B, например,

class B {
    private:
        A a;
    public:
        B(): a(3, 4) {}
}
...