我有一个类型为struct node的私有变量(请注意,struct节点在头文件中有左,右和父指针以及属性:T value
,其中T是模板类型): / p>
node<T>* root
然后我在.cpp文件中使用以下方法:
template<> void RedBlack<int>::setRoot(int elem) {
root->value=elem;
}
但是,当我尝试在main方法中创建类的实例,然后尝试从那里设置root的值时,我收到运行时错误:访问不良。
有什么问题吗?附: “模板”概念还是新手。
答案 0 :(得分:1)
我在头文件中有一个
struct node
类型的私有变量
不,你没有!你实际拥有的是node<T>
的指针。在您告知之前,它不会指向有效的node
对象。如果您尝试取消引用尚未指向有效对象的指针(当您对其执行->
时会发生这种情况),则您具有未定义的行为。你很幸运,你的环境给你一个很好的错误。任何事情都可能发生。
您将不得不创建node<T>
。一种方法是,如果您的类始终具有根节点,则只需将该成员设为node<T>
,而不是node<T>*
。然后根节点是类的一部分。否则,您可以通过执行以下操作动态分配它:
root = new node<T>();
但是,不建议动态分配。您必须记住类中析构函数中的delete root;
,否则可能会导致内存泄漏。它还意味着提供用户定义的复制构造函数和赋值运算符以避免泄漏。相反,如果您需要动态分配的node
,则应该查找smart pointers。
答案 1 :(得分:0)
您是否为对象根点分配了内存?
node<T>* root = new node<T>();
您需要在使用之前分配指针引用的对象。如果你不这样做,它指向“什么都没有”,解除引用它会做坏事(如果它指向NULL则为异常,如果指向旧实例或其他对象则使用垃圾等)。
另外,你变量,指针需要在某处“活”。
最好的地方可能是包含root的类:
class MyClass
{
private:
node<T>* root;
public:
MyClass() // Constructor
{
root = new node<T>();
}
~MyClass() // Destructor
{
// NOTE: If root contains pointers, you need to delete the objects
// they point to as well.
delete root;
}
// Add functions to do something with root...
};