2017-03-23 5 views
3

아래 코드에서 myClass의 생성자에서 msms({4,5})으로 초기화합니다.클래스 생성자에서 사용자 정의 struct 객체를 초기화하는 올바른 방법

#include <iostream> 

class myClass { 
private: 
    struct myStruct { 
    int val1; 
    int val2; 
    }; 

public: 
    myStruct ms; 
    myClass() : ms({4,5}){} // This is where I initialize ms! 
}; 

int main(){ 
    myClass mc; 
    std::cout << mc.ms.val1 << " " << mc.ms.val2 << std::endl; 
    return 0; 
}; 

그러나, 우리는 멤버 초기화 목록에있는, 그래서 ms의 인수는 MS의 생성자에 인수입니다. 여기에서 발생하는 것은 입니다. 우리는 이른바 "목록 초기화"를 사용하여 무명 (익명) myStruct 개체를 만듭니다. "{4,5}"개체를 생성 한 다음 개체를 생성자 ms에 전달합니다. . 원칙적으로 익명 중간 개체가 만들어 그래서, ms, 을 초기화 복사 된 다음 파괴 (;하지만 의미 차이는 여전히 존재 내가 컴파일러는 더 나은 을 알고 직접 ms를 초기화 것을 확신하지만). 내가 대신 ms({4,5})의 나는 단순히

ms(4,5) 

을하고 중간 객체를 만드는 피할 수 있다는 말을 들었다. 그러나, 나는이 작업을 수행 할 때, 나는 다음과 같은 출력을 얻을 :

g++ -g -std=c++11 -Wall temp.cpp -o temp 
temp.cpp: In constructor ‘myClass::myClass()’: 
temp.cpp:12:21: error: no matching function for call to ‘myClass::myStruct::myStruct(int, int)’ 
    myClass() : ms(4,5){} 
        ^
temp.cpp:5:10: note: candidate: myClass::myStruct::myStruct() 
    struct myStruct { 
     ^
temp.cpp:5:10: note: candidate expects 0 arguments, 2 provided 
temp.cpp:5:10: note: candidate: constexpr myClass::myStruct::myStruct(const myClass::myStruct&) 
temp.cpp:5:10: note: candidate expects 1 argument, 2 provided 
temp.cpp:5:10: note: candidate: constexpr myClass::myStruct::myStruct(myClass::myStruct&&) 
temp.cpp:5:10: note: candidate expects 1 argument, 2 provided 
makefile:15: recipe for target 'temp' failed 
make: *** [temp] Error 1 

그래서, 명확하게하기를, 나는 클래스 생성자에서 구조체 객체를 초기화하는 측면에서, 가장 좋은 방법이 무엇인지 궁금. 모든 도움을 많이 받으실 수 있습니다!

+0

http://stackoverflow.com/questions/4203010/how-to-initialize-member-struct-in-initializer-list-of-c-class – dmi

+1

감사합니다. @dmi. 이것은 내게 약간의 통찰력을 주었지만, 내 질문에 올바르게 대답하지 않는 것 같았습니다. – JCKaz

답변

2

은 내가 대신 ms({4,5})의 나는 단순히 거의 맞아 ms(4,5)

하지만 꽤을 할 수 있다는 말을 들었다. 실제로 할 수있는 일은 ms{4,5}입니다. 즉, 구성원 ms에 대해 직접 목록 초기화를 사용하십시오. 그렇게하면 일반 목록 초기화 규칙을 사용하게되며,이 경우 사용자 집계 초기화가 호출됩니다.

즉, 구성원 ms은 임시 개체 (예 : myStruct)를 만들지 않고 바로 직접 초기화됩니다.

+0

@Angew! 감사합니다! 이렇게하면 불필요한 중간 객체를 사용하고 있지 않은지 확인할 수 있습니까? – JCKaz

+0

저는 개인적으로 C++ 11 표준에 의해 지원 되더라도 매우 위험한 경향이 있으므로 제 생각에는이 초기화 방법을 권장하지 않습니다. 구조체에 생성자를 제공하고'ms()'로 초기화하는 것이 개인적인 취향에 따라 더 좋습니다. – dmi

+0

@JCKaz 예, 보증합니다. 더 명확하게하기 위해 문구를 변경했습니다. – Angew