Экземпляр класса внутри объявления класса с постоянными аргументами

У меня возникают проблемы с объявлением экземпляров класса с постоянными аргументами внутри определения другого класса.

class Foo
{
    private:
        const int m_a, m_b;
    public:
        Foo(int a, int b) : m_a(a), m_b(b) {}
};

class Bar
{
    public:
        Foo foo1(1,2);
        Foo foo2(2,3);
};

Из этого я получаю ошибки:

"error: expected identifier before numeric constant"
"error: expected ',' or '...' before numeric constant"

3 ответа

Решение

Это не способ инициализации членов данных. Вы должны сделать это в списке инициализации конструктора:

class Bar
{
public:
    Bar() : foo1(1,2), foo2(2, 3) { }
    //    ^^^^^^^^^^^^^^^^^^^^^^^
    //    This is how you initialize the sub-objects of a class
    //    (both base sub-objects and member sub-objects)
    Foo foo1;
    Foo foo2;
};

Обратите внимание, что C++11 допускает встроенную инициализацию ваших членов данных, но синтаксис немного отличается (вам нужно использовать фигурные скобки):

class Bar
{
public:
    Foo foo1{1, 2};
    Foo foo2{2, 3};
};

Или, альтернативно, вы можете использовать синтаксис инициализации копирования:

class Bar
{
public:
    Foo foo1 = Foo(1, 2);
    Foo foo2 = Foo(2, 3);
};

Вы должны инициализировать эти члены через ваш конструктор:

class Bar
{
    public:
        Foo foo1;
        Foo foo2;

        Bar() : foo1(1, 2), foo2(2, 3) {}
};

То, что следует за двоеточием, это список членов-инициализаторов.

В C++03 Bar необходимо инициализировать его атрибуты в конструкторе:

class Bar
{
    public:
        Foo foo1;
        Foo foo2;

        Bar() : foo1(1,2), foo2(2,3) {} 
};
Другие вопросы по тегам