У меня возникают проблемы с объявлением экземпляров класса с постоянными аргументами внутри определения другого класса.
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"
Это не способ инициализации членов данных. Вы должны сделать это в конструкторе список инициализации:
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) {}
};