C++创建Cards对象数组报no match for 'operator='错误求解决
问题根因
你的报错是三处基础语法错误共同导致的:
- 你声明的
stackData是Cards*类型的动态数组指针,在赋值前没有分配内存,直接访问stackData[maxSize]属于非法内存访问 - 你写的
stackData[maxSize] = {初始化列表}是语法错误:该写法本意是给数组下标为maxSize的单个元素赋值,而非给整个数组初始化,同时C++不允许给已经定义的数组直接用花括号初始化列表批量赋值,这种写法仅支持数组定义时的初始化操作 - 你头文件中仅对
Cards类做了前置声明,在Deck.cpp中如果没有包含Cards类的完整头文件,无法调用Cards的构造函数完成对象创建
修复方案
- 首先在
Deck.cpp顶部引入Cards类的完整头文件,例如#include "Cards.h" - 修正动态数组的初始化写法,C++11及以上标准支持new动态数组时直接绑定初始化列表,修正后的构造函数代码如下:
Deck::Deck(int maxSize) { // 先校验传入的maxSize是否足够容纳53张牌,避免溢出 if (maxSize < 53) { // 可根据需求做错误处理,这里示例直接抛出异常 throw std::invalid_argument("maxSize must be at least 53 to hold all cards"); } //Set Size this->maxSize = maxSize; temp = 0; value = 0; next = 0; remaining = maxSize; // 分配内存同时完成数组初始化 stackData = new Cards[maxSize] { Cards(1,club), Cards(1,spade), Cards(1,heart), Cards(1,diamond), Cards(2,club), Cards(2,spade), Cards(2,heart), Cards(2,diamond), Cards(3,club), Cards(3,spade), Cards(3,heart), Cards(3,diamond), Cards(4,club), Cards(4,spade), Cards(4,heart), Cards(4,diamond), Cards(5,club), Cards(5,spade), Cards(5,heart), Cards(5,diamond), Cards(6,club), Cards(6,spade), Cards(6,heart), Cards(6,diamond), Cards(7,club), Cards(7,spade), Cards(7,heart), Cards(7,diamond), Cards(8,club), Cards(8,spade), Cards(8,heart), Cards(8,diamond), Cards(9,club), Cards(9,spade), Cards(9,heart), Cards(9,diamond), Cards(10,club), Cards(10,spade), Cards(10,heart), Cards(10,diamond), Cards(11,club), Cards(11,spade), Cards(11,heart), Cards(11,diamond), Cards(12,club), Cards(12,spade), Cards(12,heart), Cards(12,diamond), Cards(13,club), Cards(13,spade), Cards(13,heart), Cards(13,diamond), Cards(0, joker) }; for (int i = 0; i < maxSize; i++){ stackData[i].print(); } }
- 如果你的编译环境不支持C++11及以上标准,就先分配内存再逐个赋值:
stackData = new Cards[maxSize]; stackData[0] = Cards(1,club); stackData[1] = Cards(1,spade); // 依次写完所有53张牌的赋值逻辑
- 额外注意:需要在
Deck类的析构函数中添加delete[] stackData;释放动态申请的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

