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
相关产品推荐
相关产品推荐

