2017-10-26 24 views
0

내 파서는 빈 노드 기본 구조체에서 상속받은 NodeSomething 구조체로 구성된 추상 구문 트리를 만듭니다. 이들은 std::list<Node>에 저장됩니다.빈 기본 클래스에서 상속 한 구조체가 포함 된 초기화 목록 사용

내 문제는 모든 단일 NodeSomething에 대한 생성자를 작성하고 싶지 않으며 구조체가 모두 기본 클래스에서 상속하므로 더 이상 집계가되지 않으므로 initaliser 목록을 사용할 수 없습니다 (중괄호 초기화).

이 구조체는 모두 매우 간단하며 하나 또는 두 개의 int 또는 string 변수가 포함되어 있기 때문에 모든 구조체에 대해 기본 생성자를 작성해야하는 것처럼 보입니다. 상속의 필요성을 없애 겠지만, 다양한 Node 하위 클래스의 일반적인 목록을 만드는 더 좋은 방법은 없습니다. 어쨌든 여기

몇 가지가 무슨 뜻인지 설명하는 코드 샘플을 손질입니다 :

struct Node {}; 

struct NodePerson : Node 
{ 
    std::string name; 
    int age; 
}; 

struct NodeVariable : Node 
{ 
    int val; 
}; 

그리고를 다음과 같이 구현 뭔가 :

std::list<Node> tree; 

tree.push_back(NodePerson {"Paul", 23}); 

이 다음 3 no matching constructor for initalization of 'NodePerson' 오류를 뱉어하고합니다 암시 적 이동, 복사 및 기본 생성자에 대한 인수 불일치 (2가 예상 됨 1)에 대한 참고 사항입니다.

구조체가 더 이상 집계가 아니며 중괄호를 사용할 수 없기 때문에 예상되는 동작입니다. 그러나 각각에 대해 생성자를 작성해야하는 것은 매우 유능하지 않은 것처럼 보입니다. 이 간단한 해결책이 있습니까?

편집 : 내가 명확하게 이해하지 못했기 때문에 Node은 상속에만 사용되는 추상 클래스이므로 다른 노드 유형의 목록을 저장할 수 있습니다.

+0

'NodePerson' 클래스를 제거 하시겠습니까? 어쨌든'Node' 객체를 저장하고 있으므로 필요하지 않습니다. – juanchopanza

+0

클래스 계층 구조가 실제로 이렇게 보이는 경우,'Node'에 대한 포인터는 기본적으로 쓸모가 없습니다. 메서드가 없으므로 아무 것도 할 수 없습니다. 디자인을 다시 생각해 볼 수도 있습니다. – Brian

+0

'Node'의 실제 인스턴스를 저장하지 않습니다. 각각의 NodeSomething 구조체는 가상 머신에 의해 실행될 키워드/명령어에 해당하므로 구조체 유형 자체는 유용한 정보를 전달하며 변수는 기본적으로 지시. – tokamach

답변

0

집합 초기화을 사용하려고합니다. 이는 개체의 각 데이터 멤버에 대한 이니셜 라이저 목록을 제공하면서 개체가 가질 수있는 생성자를 건너 뜁니다.

그러나 기본 클래스가 있으면 개체가 집계되지 못하게됩니다 (C++ 14 이하). 따라서 집계 초기화를 적용 할 수 없습니다.

C++ 17에서는 "집계"의 정의가 확장되어 코드가 합법적이됩니다. 아직 C++ 17 컴파일러를 사용할 수 없다면 생성자를 추가하는 것과 같은 다른 옵션으로 넘어 가야합니다.