这是一项家庭作业,所以我需要解释(而不是直接代码)。
我们最近开始学习复制构造函数/赋值=运算符等。在我们上课的讲义中,我们的教授告诉我们如果你想要深度复制指针你必须取消引用它们并直接复制值。
例如:(来自讲义)
class IntCellFixed {
public:
IntCellFixed(int initialValue = 0) { storedValue = new
int(initialValue); }
//v This bit here v
IntCellFixed(const IntCellFixed &source) {
storedValue = new int();
*storedValue = *source.storedValue;
}
//^ This bit here ^
(...)
private:
int *storedValue;
};
这对我有意义。你有一个指针,你希望它指向的值等于你要复制的指针的值。所以你要*让它改变它指向的地址的值,而不是地址本身。这对我来说很有意义。
所以当我们在实验室中应用它时,我尝试了类似的东西,但使用链表而不是指向整数的指针。即使TA的帮助(TA看着并调整我的代码直到它是“正确”的东西),它仍然无法工作,只是给了我一个段错误。我没有机会询问代码应该是什么,并且该解决方案还没有发布。
我们的作业几乎完成了同样的事情。这是我们节点的结构(在二叉搜索树中):
struct Node {
int data;
int count;
Node *left;
Node *right;
};
在我的void BinarySearchTree :: insert(Node * node,Node * parent,int value)函数中,我有这段代码:
if (node == NULL) {
node = new Node();
*node->data = value;
*node->count = 1;
node->left = NULL;
node->right = NULL;
}
然而,当我尝试这样做时,它给了我错误:一元'*'的无效类型参数(有'int')。 当我取下*时,它运行正常,但实际上并没有保存插入函数之外的节点的数据。 (即:当试图插入多个值时,它总是以空树开始,即使我已经插入了值之后也是如此)。
据我了解,我需要取消引用该节点,因为我不希望它指向的地址发生变化,我想要更改地址的地址。
我是否完全误解了何时/何时取消引用?如果我是,有人可以解释我什么时候需要,为什么在这种情况下我不需要?或者,如果这是语法错误,有人可以告诉我语法应该是什么?