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

C++多态开发战舰游戏CPU类时构造函数报重定义错误

报错原因

编译派生类cpu_medium时触发redefinition of 'cpu_medium::cpu_medium(board&)'重定义错误,核心原因有两个:

  • 头文件cpu_battleships.h中,你已经在cpu_medium的类定义内写了构造函数的完整内联实现cpu_medium(board &e):cpu_easy(e){};,这已经是符合C++语法的构造函数定义,按照单定义规则,同一个函数不能存在两个同级定义。
  • 源文件cpu_battleships.cpp中你又重复写了一次cpu_medium的构造函数,且写法本身有语法错误:cpu_medium::cpu_medium(board &e):cpu_easy(e){}这行已经是完整的函数定义,下一行单独书写的空大括号{}是不属于任何函数的无效代码块,会直接触发编译器的重定义判定。

另外还有一个潜在链接错误:基类cpu_easy声明了虚析构函数virtual ~cpu_easy();但未提供实现,后续链接阶段会报undefined reference错误。

修复方案

两种修复方式二选一即可,禁止同时保留两份构造函数定义:

方案1:保留头文件内联实现,删除cpp冗余代码

如果不需要在构造函数里写cpu_medium专属的复杂初始化逻辑,直接保留头文件的内联写法即可:

  1. 头文件中cpu_medium的构造函数可以简化(去掉末尾冗余的分号,不删也不影响编译):
class cpu_medium : public cpu_easy
{
    public:
        cpu_medium(board &e):cpu_easy(e){}
};
  1. 直接删除cpu_battleships.cpp中所有和cpu_medium构造函数相关的代码,同时补上基类的虚析构实现:
// 基类构造函数实现
cpu_easy::cpu_easy(board &e)
{
    enemy=&e;
}
// 补上基类虚析构实现,避免链接错误
cpu_easy::~cpu_easy() = default;

方案2:构造函数实现移到cpp,头文件仅保留声明

如果后续要在cpu_medium构造函数里写专属初始化逻辑、不想把实现放在头文件,就把声明和定义分离:

  1. 修改头文件cpu_battleships.h,删掉cpu_medium构造函数的函数体,仅保留声明:
class cpu_medium : public cpu_easy
{
    public:
        cpu_medium(board &e);
};
  1. 修改cpu_battleships.cpp里的构造函数实现,删掉多余的空代码块,同时补上基类析构实现:
cpu_easy::cpu_easy(board &e)
{
    enemy=&e;
}

cpu_easy::~cpu_easy() = default;

// 正确的派生类构造函数实现,不要在初始化列表后提前闭合函数体
cpu_medium::cpu_medium(board &e):cpu_easy(e)
{
    // 这里写cpu_medium专属的初始化逻辑,没有逻辑就留空
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:33:43