2015-06-10 3 views
2

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

.h файл:

class A 
{ 
public: 

struct Result 
{ 
    int x; 
    UGraph G;  <------ class definition 
}; 
Result m_tempStructResult; 

A:A(void); 
void function(); 
} 

.cpp файл

A::A() 
{ 

} 

void A::function() 
{ 
UGraph Graph(10);  <---- object has to receive a value 

... 
       //manipulations on Graph 
... 

m_tempStructResult.G = Graph; 
} 

в ошибка компиляции я получаю:

error C2512: 'A::Result' : no appropriate default constructor available 

, поэтому проблема заключается в отсутствии конструктора по умолчанию, поэтому я добавил следующее:

struct Result 
    { 
     Result::Result(int graph_size=0) : G(graph_size){ 
     } 

     int x; 
     UGraph G; 
    }; 

и проблема решена.

Мой вопрос в том, есть ли другой способ инициировать класс UGraph G внутри конструктора класса A? а не внутри его структуры-члена?

спасибо.

ответ

6

Да, используйте список инициализации в конструкторе Result:

Result::Result() : G(0) // you have to insert some integer here 
{ 

} 

Другой способ в C++ 11, чтобы дать ему значение по умолчанию внутри класса:

struct Result 
{ 
    UGraph G = UGraph(10); 
}; 

For A небольшая демонстрация, см. here.


EDIT Благодаря @OthmanBenchekroun, я, наконец, кажется, я понял вопрос:

Так вот еще один пример кода, который использует aggregate initialization для инициализации членов Result (без изменения конструктора из последних).

struct G 
{ 
    G(int) {} 
}; 

struct Result 
{ 
    int x; 
    G g; 
}; 

struct A 
{ 
    A() : m_tempStructResult{1, G(1)} {} 

    Result m_tempStructResult; 
}; 

int main() 
{ 
    A{}; 
} 

Другая демо-версия here.

Это не значит, что я предлагаю сделать это. Скорее я бы дал Result соответствующий конструктор по умолчанию. В противном случае он может стать непригодным.

+0

'G' не является членом' A' –

+0

проблема в том, что G является членом структуры «Результат» ans «Результат» является членом класса A – user1673206

+0

@OthmanBenchekroun: правильный, 'G' является членом «Результат», я сделал редактирование. Тем не менее, идея должна была стать ясной :-) – davidhigh

1

мой вопрос в том, есть ли другой способ инициировать класс UGraph G внутри конструктора класса A? а не внутри его структуры-члена?

Вы не можете инициировать G, который является членом результата без «построения» Результат, G является членом Result не является членом A. Таким образом, нормальный способ сделать это состоит в инициировании Result в constructor из A и constructor из Result инициирует G

+0

, хотя это рекомендуемый способ imo, есть еще альтернатива ... см. Мое редактирование, которое вы вызвали (спасибо снова). – davidhigh

+0

@davidhigh Я видел, что все еще инициировал m_tempStructResult.G внутри конструктора Result, вы просто передали конструктору копию. Но, похоже, это то, что ему нужно. (приветствуется) –

1

Вы можете использовать инициализацию список для построения m_tempStructResult с специально построен G в списке инициализации членов из A (или скобки или равно инициализатор A::m_tempStructResult):

A::A(): 
    m_tempStructResult { 
     0, // x 
     10 // G, braces can be elided (only for non-explicit constructors as pointed out by davidhigh) 
    } 

G все еще инициализируется в объекте члена, но код в конструктор A (а не тело, но список инициализации члена), который, как я предполагаю, вы имели в виду.

+1

Как побочное замечание, преобразование, которое вы подразумеваете, работает только для конструкторов, которые не являются «неявными». – davidhigh

+0

@ davidhigh хорошая точка, добавил это к комментарию. – user2079303

Смежные вопросы