2013-04-21 2 views
1

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

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" 
+0

декларация не инициализации –

ответ

11

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

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); 
}; 
+0

ли это потому, что экземпляры класса считаются «константные» объекты типа? Я считал, что только члены const должны быть инициализированы в списке инициализации конструктора? – Wilsonator

+1

@Wilsonator: Нет, это так, как вы инициализируете субобъекты вообще. Члены 'const' (или ссылочные члены) могут * только * инициализироваться таким образом (члены' const' могут быть построены по умолчанию, хотя) –

+0

Просто чтобы быть понятным, синтаксис инициализации копии также является C++ 11? – Wilsonator

5

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

class Bar 
{ 
    public: 
     Foo foo1; 
     Foo foo2; 

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

Что следует двоеточие является member-initializer list.

1

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

class Bar 
{ 
    public: 
     Foo foo1; 
     Foo foo2; 

     Bar() : foo1(1,2), foo2(2,3) {} 
}; 
Смежные вопросы