You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++构造函数内初始化Card对象报错:类类型无合适operator()

问题分析与解决

错误原因

你遇到的错误翻译为:"调用了类类型的对象,但没有合适的operator()或转换为指向函数的指针类型"

问题出在两个核心点:

  • Maingame构造函数里的card1(DIAMONDS, THREE)写法错误——card1是已创建的Card对象,这种语法试图把它当作函数调用,但Card类并未定义函数调用运算符operator(),因此编译器报错。
  • 更关键的是:你的Card类只定义了带两个参数的构造函数,编译器不会自动生成默认构造函数。而Maingame中的Card card1;成员,会在进入Maingame构造函数体之前尝试默认初始化,这本身就会导致编译失败(因为找不到Card的默认构造函数)。

解决方案

正确的做法是使用成员初始化列表来初始化Maingame中的Card成员,这是C++中初始化类成员变量的标准方式:

修改Maingame构造函数实现

Maingame::Maingame() : card1(DIAMONDS, THREE) {
    // 构造函数体无需再初始化card1,初始化工作已在列表中完成
}

扩展:创建5个Card对象的写法

如果要在Maingame中定义5个Card成员,比如card1到card5,同样用初始化列表完成初始化:

// Maingame类定义
class Maingame
{
public:
    Maingame();
    void run();
    void out();
private:
    Card card1;
    Card card2;
    Card card3;
    Card card4;
    Card card5;
};

// Maingame构造函数实现
Maingame::Maingame() 
    : card1(DIAMONDS, THREE),
      card2(HEARTS, ACE),
      card3(SPADES, KING),
      card4(CLUBS, QUEEN),
      card5(DIAMONDS, TEN) {
}

额外说明

成员初始化列表的优势:

  • 避免"默认初始化+赋值"的额外开销,直接在对象创建阶段完成初始化
  • 对于没有默认构造函数的类(比如你的Card),必须使用这种方式初始化成员变量

内容的提问来源于stack exchange,提问作者Davie A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:55:18