Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在构造函数中构造对象并分配引用?_C++_Object_Gcc_Constructor_Reference - Fatal编程技术网

C++ 如何在构造函数中构造对象并分配引用?

C++ 如何在构造函数中构造对象并分配引用?,c++,object,gcc,constructor,reference,C++,Object,Gcc,Constructor,Reference,我有一个名为Tree的类,它有三个实例变量,分别是board(board)、root(Node)和end(Point)。此外,它还有一个包含六个参数的构造函数。我想在构造函数中创建对象,并将它们分配给引用(实例变量) 当我尝试分配根时,无法引用我得到的函数“Node::operator=(const Node&)”(隐式声明)——这是一个已删除的函数错误 我做了一些研究,似乎您必须在构造函数初始值设定项中构造引用变量,但如果不更改参数,我无法弄清楚如何进行。我知道初始化器是如何工作的,但问题在于

我有一个名为Tree的类,它有三个实例变量,分别是board(board)、root(Node)和end(Point)。此外,它还有一个包含六个参数的构造函数。我想在构造函数中创建对象,并将它们分配给引用(实例变量)

当我尝试分配根时,无法引用我得到的
函数“Node::operator=(const Node&)”(隐式声明)——这是一个已删除的函数
错误

我做了一些研究,似乎您必须在构造函数初始值设定项中构造引用变量,但如果不更改参数,我无法弄清楚如何进行。我知道初始化器是如何工作的,但问题在于构造函数块。我想在块中创建对象并赋值,因为我不能直接使用初始值设定项而不更改对象本身的参数。如果这段代码是Java,那么它就可以工作了

/*头文件*/
类树{
公众:
树(内部板高、内部板宽、内部骑士星位置、,
int-KnightsStartPosition、int-KnightdXPosition、int-Knightdyposition);
私人:
Board&Board;//电路板具有int高度和int宽度。
Node&root;//节点具有位置(点)和结束(点)
Point&end;//点是x和y的平面向量。
void jumpNodes(Node*Node);//尚未使用
};
/*实现文件*/
树::树(int boardHeight、int boardWidth、int knightStartXPosition、,
int-KnightsStartPosition,int-KnightdXPosition,int-Knightdyposition){
点开始=点(骑士位置,骑士位置);
点结束=点(骑士之星位置、骑士之星位置);
节点根=节点(开始、结束);
此->板=板(板高、板宽);
this->root=root;//此行给出了错误
这->结束=结束;
};

预期的解决方案是构造函数使用给定的参数,但如果不可能,我需要输入和结构。

首先,您将临时/局部变量分配给引用,因此引用将在构造函数之后立即失效,因为它们引用的对象超出范围

其次,引用类似于不可变指针(无法更改其指向的对象的指针),当输入函数体时,引用成员已经初始化,因此无法重新指向它们

要正确初始化成员引用,请使用初始化列表:

Foo::Foo(int&bar,float&baz):mubar(bar),mubaz(bar){…}

其中
Foo
是类名,
bar
baz
参数和
mubar
mubaz
是成员。注意
&


另外,我认为在您的例子中,您实际上希望按值存储它们,至少我认为没有理由使用引用,因为所有参数都是按值传递的。引用需要引用某些必须存储在某处的内容

首先,您不应为此使用引用成员。它们用于名称何时应引用已存在的对象

该类可以如下所示:

class Tree {
public:
    Tree(int boardHeight, int boardWidth, Point knightStart, Point knightEnd);

private:
    Board board;
    Node root;
    Point end;
};

/* IMPLEMENTATION FILE */
    Tree::Tree(int boardHeight, int boardWidth, Point knightStart, Point knightEnd)
        : Board(boardHeight, boardWidth), root(knightStart, knightEnd), end(knightEnd) {}
你能看到的比你现在拥有的要简单得多。事实上,通常的做法是将构造函数体内联到头中,因为它只初始化成员,不做任何复杂的事情

当我尝试分配根时,无法引用我得到的函数“Node::operator=(const Node&)”(隐式声明)——这是一个已删除的函数错误

此消息可能表示您在
节点
类中做了类似的事情,即使用引用变量作为成员,这会禁用隐式赋值(出于此原因)。您应该重新设计其他类,以避免以这种方式使用引用

此外,在您引用的错误消息之前,您应该获得其他错误消息。特别是,您没有初始化引用成员。一般来说,当您有多个错误时,您应该首先集中精力修复第一个错误,因为其他错误通常是第一个错误的后果,并且在第一个错误消失后将消失

如果这段代码是Java,那么它就可以工作了

C++与Java不同,你最好习惯这个事实。如果您使用类型为
std::shared_ptr
的成员而不是
Board
,那么它将具有与Java引用相似(但不完全相同)的语义。但是,除非您特别希望在多个树之间共享单板对象,否则这将被认为是C++中的低级风格。p>

C++中,引用变量不对绑定到的对象执行生存期管理;此外,它必须在初始化时绑定,并且不可能重新绑定。希望很明显,这不适合您使用它的方式。尽管名称相同,但它与Java引用有不同的用途和行为。

更改为
Board;节根;点端。将变量声明为引用意味着它将引用已经存在的对象这是否回答了您的问题?如果您打算在构造函数中创建变量(好主意),那么让它们引用是错误的选择。原因是在评论中byx M.M.I知道引用必须在开始时被初始化,因为它们不能为空,但是我认为我的思维方式是C++所要求的其他语言,因此我想在构造函数块中这样做。