构造函数初始化错误

时间:2014-03-10 13:38:53

标签: c++ constructor reference initialization

我正在创建一个简单的纸牌游戏基础,现在我正在创建代表每个玩家的对象的类。但是构造函数似乎有问题:'Spelare'的构造函数必须显式初始化引用成员'leken'

class Spelare {
public:
    Spelare(Kortbunt& kortlek, bool ar_dator) {leken = kortlek; dator = ar_dator;} //Constructor
    int spela();

private:
    Kortbunt hand; //The cards in the players hand
    Kortbunt& leken; //The cards on the table
    const bool dator; //Is this player a computer?
};

4 个答案:

答案 0 :(得分:1)

将构造函数更改为:

Spelare(Kortbunt& kortlek, bool ar_dator) : leken(kortlek), dator(ar_dator) {} 

问题是一旦声明并初始化了引用,就不能重新赋值。您的构造函数尝试声明但不初始化引用,然后分配给它 - 哪个失败。

您需要通过构造函数的初始化列表初始化引用。你还需要为dator做同样的事情,因为它是const - 但这只是一般的好习惯。

答案 1 :(得分:0)

引用和const成员必须像这样初始化:

Spelare(Kortbunt& kortlek, bool ar_dator) : leken(kortlek), dator(ar_dator) {} 

但是,作为班级成员的参考会使我烧了几次,所以我建议不要这样做。

答案 2 :(得分:0)

试试这个:

class Spelare {
public:
    Spelare(Kortbunt& kortlek, bool ar_dator)
        : leken(kortlek), dator(ar_dator)
    {}

    // ...
};

所以诀窍是在初始化列表中初始化leken。必须这样做,因为它是一个引用(请注意其声明中的&)。在类中声明的引用必须以这种方式初始化。

最后,由于dator是一个const而且无法分配,因此它也必须在初始化列表中初始化。

答案 3 :(得分:0)

类成员的初始化在ctor体内执行而不是。进入ctor体时,所有成员变量都已初始化,因此会执行 assignment

通常使用初始化列表来执行类成员的初始化。

struct Foo {
    Foo(int a, int b, int c)
        : a{a}, b{b}, c{c} // Initialization list.
    {
        /* ctor body */
    }
    int a;
    int b;
    const int c;

    std::string s{"Test"}; // C++11 also allows non-const in class initialization.
};

由于参考必须初始化以指向某些数据并且可以重新分配以便稍后指向其他一些数据,以下是错误。

struct Bar {
    Bar(Foo& f) // Error: uninitialized reference member.
    {
        f_ = f; // If f_ had been initialized this is assignment to where f_ points,
                // not reassignment of what data f_ is a reference to.
    }
    Foo& f_;
};

同样const成员无法(自然地)分配,他们必须初始化到某个值。