在构造函数中初始化对象C++

exdqitrt  于 2023-03-14  发布在  其他
关注(0)|答案(2)|浏览(223)

我是C++新手,无法解决我遇到的这个错误。我创建了一个Card类,它将花色和排名存储为无符号整数。我还有一个Maingame类,它运行多个函数。我想在Maingame类中创建5个Card对象,但我在初始化它们时遇到了问题。我的Card类是这样的。

class Card
{
public:
    Card(unsigned int s, unsigned int r);
private:
    unsigned int _suit;
    unsigned int _rank;
};

和Card()的构造函数

Card::Card(unsigned int s, unsigned int r) {
    _suit = s;
    _rank = r;
}

在Maingame类中创建Card对象

class Maingame
{
public:
    Maingame();
    void run();
    void out();
private:
    Card card1;
};

Maingame的构造函数

Maingame::Maingame() {
    card1(DIAMONDS, THREE);
}

这就是我得到错误“调用类类型的对象时没有适当的operator()或转换为指向函数的指针类型”的地方

e5nqia27

e5nqia271#

您的语法错误。您似乎正在尝试 * 初始化列表 *,这是语法

Maingame::Maingame() : card1(DIAMONDS, THREE)
{
}

如果你有一个以上的项目要初始化,那么你会分开他们与逗号。

k10s72fa

k10s72fa2#

在您的Maingame类中,card1类成员是在输入Maingame()构造函数的 body 之前构造的。Maingame()body 试图对已经构造的card1对象调用operator()调用,该对象没有定义这样的运算符,因此出现错误。
此外,由于card1类成员未在Maingame()构造函数的member initializer list中 * 显式地 * 初始化,因此编译器将默认构造card1类成员,这也将失败,因为Card未定义default constructorCard定义了接受2个输入值的自定义构造函数,因此编译器生成的默认构造函数被禁用,并且Card没有显式定义单独的默认构造函数。
因此,此代码:

Maingame::Maingame() {
    card1(DIAMONDS, THREE);
}

更像是这样写的:

Maingame::Maingame()
    : card1() // <-- fails, no default constructor defined
{
    card1(DIAMONDS, THREE); // <-- fails, no Card::operator() defined
}

要解决这两个问题,您需要在Maingame()构造函数的member initializer list中显式初始化Maingamecard1成员,这将允许您将输入值传递给card1的构造函数,例如:

Maingame::Maingame()
    : card1(DIAMONDS, THREE)
{
}

相关问题