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

C++程序中调用Stone类无匹配构造函数错误求助

解决no matching function for call to ‘Stone::Stone()’编译错误

嘿,这个错误我之前也踩过坑,本质原因其实很清晰:你的Stone类没有定义无参的默认构造函数,但代码里某个地方尝试默认初始化Stone对象了。

从错误提示里的候选构造函数Stone::Stone(double, std::pair, ...)能看出来,你只给Stone写了带参数的构造函数——C++有个规则:当你显式定义了任何构造函数后,编译器就不会自动帮你生成默认的无参构造函数了。这时候如果代码里出现比如Stone myStone;这种写法,或者容器(比如你用到的map)需要默认构造元素时,编译器找不到对应的构造函数,直接就报这个错。

给你几个针对性的解决思路:

1. 显式添加默认构造函数

直接在Stone类里加一个无参构造,最简单的方式是用= default让编译器自动生成空实现,或者手动给成员赋合理的默认值:

class Stone {
public:
    // 让编译器自动生成默认构造
    Stone() = default; 
    // 你原来的带参数构造
    Stone(double mass, std::pair<double, double> position, double radius, std::pair<double, double> velocity) {
        // 你的初始化逻辑
    }
};

如果需要给成员默认初始值,也可以手动实现:

Stone() : mass(0.0), position({0.0, 0.0}), radius(0.0), velocity({0.0, 0.0}) {}

2. 给现有构造函数的参数加默认值

这样你的带参构造也能当作默认构造用,一举两得:

class Stone {
public:
    Stone(double mass = 0.0, 
          std::pair<double, double> position = {0.0, 0.0}, 
          double radius = 0.0, 
          std::pair<double, double> velocity = {0.0, 0.0}) {
        this->mass = mass;
        this->position = position;
        // 其他成员初始化逻辑
    }
};

3. 检查代码里默认构造Stone的场景

结合你的Collision类使用场景,大概率是这两个地方出问题:

  • Collision类的成员变量里有没有直接声明Stone s1;但没在初始化列表里赋值?
  • 你的map集合操作:如果用collection[s1in]这种方式访问元素,当键不存在时,map会自动默认构造一个Stone对象插入进去,这时候就会触发错误。建议改用collection.at(s1in)来访问,它会在键不存在时抛出异常,而不是默认构造对象。

比如修改Collision构造函数里的代码:

Collision::Collision(double timein, string s1in, string s2in, map<string, Stone> collection) {
    // 用at()代替[],避免默认构造Stone
    Stone s1 = collection.at(s1in);
    Stone s2 = collection.at(s2in);
    // 你的碰撞计算逻辑
}

按上面的思路调整后,这个编译错误应该就能解决啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:37:17