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

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

当我尝试分配根目录时,出现function "Node::operator=(const Node &)" (declared implicitly) cannot be referenced -- it is a deleted function错误。

我做了一些研究,似乎您必须在构造函数初始化程序中构造引用变量,但是我无法弄清楚在不更改参数的情况下如何做。我知道(inda)初始化器是如何工作的,但是问题出在构造函数块中。我想在块中创建对象并进行分配,因为在不将参数更改为对象本身的情况下,我无法直接使用初始化程序。如果这段代码是Java,那么它将起作用。

/* HEADER FILE */
class Tree {
public:
    Tree(int boardHeight,int boardWidth,int knightStartXPosition,int knightStartYPosition,int knightEndXPosition,int knightEndYPosition);

private:
    Board& board; // Board has int height and int width.
    Node& root; // Node has location (Point) and end (Point)
    Point& end; // A point is a plane vector of x and y.

    void jumpNodes(Node* node); // not used yet
};
/* IMPLEMENTATION FILE */
Tree::Tree(int boardHeight,int knightEndYPosition) {
        Point start = Point(knightEndXPosition,knightEndYPosition);
        Point end = Point(knightStartXPosition,knightStartYPosition);
        Node root = Node(start,end);

        this->board = Board(boardHeight,boardWidth);
        this->root = root; // this line gives the error
        this->end = end;
};

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

taidengmeidian 回答:如何在构造函数中构造对象并分配引用?

首先,您要为引用分配临时对象/本地对象,因此在构造函数之后,该引用将失效,因为它们引用的对象超出了范围

第二,引用就像一个不可变的指针(一个不能更改其指向的指针),并且您的引用成员在输入函数Body ist时已经初始化,因此无法重新指向它们。

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

Foo::Foo(int& bar,float& baz) : m_bar(bar),m_baz(bar) {...}

Foo为类名,barbaz自变量以及m_barm_baz是成员。请注意:&

我还认为,在您的案例中,您实际上要按值存储它们,至少我看不到引用的理由,因为所有参数都按值传递。引用需要引用必须存储在某处的内容

,

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

该类可能类似于:

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,Point knightEnd)
        : Board(boardHeight,boardWidth),root(knightStart,knightEnd),end(knightEnd) {}
您可以看到的

比当前的要简单得多。实际上,在标头中内联构造函数主体是一种常见的做法,因为它仅初始化成员,并且不会做任何复杂的事情。

  

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

此消息可能表明您在Node类中做了类似的事情,即使用引用变量作为成员,这将禁用隐式赋值(原因是see here)。您应该重新设计其他类,也不要以这种方式使用引用。

此外,您应该在引用的错误消息之前得到其他错误消息。具体来说,您没有初始化参考成员。一般来说,当您遇到多个错误时,应首先着重解决第一个错误,因为其他错误通常是第一个错误的后果,一旦第一个错误消失,这些错误就会消失。

  

如果此代码是Java,那么它将起作用。

C ++与Java不同,您最好习惯这一事实。如果您使用类型std::shared_ptr<Board>而不是Board的成员,则它的语义与Java引用具有相似(但不完全相同)。但是,除非您特别打算在多个Tree之间共享单个板对象,否则这在C ++中将被视为较差的样式。

在C ++中,引用变量不会对绑定到该对象的对象执行生命周期管理;而且它必须绑定在初始化上,并且无法重新绑定。希望很明显,这不适合您的使用方式。尽管具有相同的名称,但它与Java引用的目的和行为不同。

本文链接:https://www.f2er.com/3141794.html

大家都在问