아래 코드에서 myClass의 생성자에서 ms
을 ms({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
그래서, 명확하게하기를, 나는 클래스 생성자에서 구조체 객체를 초기화하는 측면에서, 가장 좋은 방법이 무엇인지 궁금. 모든 도움을 많이 받으실 수 있습니다!
http://stackoverflow.com/questions/4203010/how-to-initialize-member-struct-in-initializer-list-of-c-class – dmi
감사합니다. @dmi. 이것은 내게 약간의 통찰력을 주었지만, 내 질문에 올바르게 대답하지 않는 것 같았습니다. – JCKaz