所以,我有基类和带有模板的派生类 它工作正常,直到我尝试删除派生类。 我测试将派生类作为一个部分,或没有模板,它工作正常,但当我将它拆分为.h和.cpp文件时,我得到错误
这很好用
template<class T>
class NodeTT: public Node
{
private:
T _data;
public:
NodeTT(Node* parent = nullptr):Node(parent){}
NodeTT(T data, Node* parent = nullptr):Node(parent),_data(data){}
~NodeTT(){std::cout<<"deriv destr"<<std::endl;}
void show(){
std::cout<<_data<<std::endl;
for(Node* childNode : _children)childNode->show();
}
};
两个文件中的相同类
HEADER
#include <iostream>
#include <node.h>
template<class T>
class TNode: public Node
{
private:
T _data;
public:
TNode(Node* parent = nullptr);
TNode(T data, Node* parent = nullptr);
~TNode();
void show();
};
SOURCE
template<class T>
TNode<T>::TNode(Node *parent) : Node(parent){}
template<class T>
TNode<T>::TNode(T data, Node* parent): Node(parent),_data(data){}
template<class T>
TNode<T>::~TNode(){
std::cout<<"deriv destr"<<std::endl;
}
template<class T>
void TNode<T>::show(){
std::cout<<_data<<std::endl;
for(Node* childNode : _children)childNode->show();
}
template class TNode<int>;
template class TNode<float>;
template class TNode<std::string>;
这个基类的析构函数
Node::~Node(){
std::cout<<"base destr"<<std::endl;
for(Node* childNode : _children)
{
delete childNode;
}
delete _parentNode;
_children.clear();
}
在输出中我得到了无限的消息&#34; base destr&#34;,所以任何帮助指出我的错误都将受到赞赏
抱歉我的英文。
答案 0 :(得分:5)
您仍未提供编译,运行和显示问题的完整程序。但delete _parentNode;
看起来不对劲。如果这是节点的层次结构,则父节点在调用子节点的析构函数时已被销毁。让这些子节点删除该父节点再次尝试销毁父节点,这反过来会尝试销毁所有已经被销毁的子节点。那会给你一个讨厌的循环。