내 파서는 빈 노드 기본 구조체에서 상속받은 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
은 상속에만 사용되는 추상 클래스이므로 다른 노드 유형의 목록을 저장할 수 있습니다.
'NodePerson' 클래스를 제거 하시겠습니까? 어쨌든'Node' 객체를 저장하고 있으므로 필요하지 않습니다. – juanchopanza
클래스 계층 구조가 실제로 이렇게 보이는 경우,'Node'에 대한 포인터는 기본적으로 쓸모가 없습니다. 메서드가 없으므로 아무 것도 할 수 없습니다. 디자인을 다시 생각해 볼 수도 있습니다. – Brian
'Node'의 실제 인스턴스를 저장하지 않습니다. 각각의 NodeSomething 구조체는 가상 머신에 의해 실행될 키워드/명령어에 해당하므로 구조체 유형 자체는 유용한 정보를 전달하며 변수는 기본적으로 지시. – tokamach