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

《C++程序设计原理与实践(第3版)》第5章示例代码编译失败求助

关于《C++程序设计原理与实践(第3版)》计算器示例编译错误的原因分析

你的问题核心是C++类的隐式默认构造函数生成规则在不同代码上下文的差异:

  1. 错误根源

    • 第3版书中的Token_stream类大概率包含了必须显式初始化的成员(比如std::istream&这类引用类型,或者const修饰的成员变量)。根据C++标准,当类包含引用、const成员,或者成员类型本身没有默认构造函数时,编译器无法自动生成有效的隐式默认构造函数,会直接将这个默认构造函数标记为删除(对应警告C4623)。
    • 你的代码中尝试直接创建Token_stream对象(比如Token_stream ts;),这会触发对默认构造函数的调用,但该函数已经被删除,因此抛出错误C2280。
  2. 为什么原书中代码能编译?
    原代码依赖作者提供的PPP.h头文件,这个头文件可能包含了预处理宏、全局对象定义或者对类的扩展声明,间接为Token_stream提供了默认构造函数的支持(比如提前绑定了输入流对象)。当你注释掉PPP.h改用标准库iostream后,这些隐藏的支持消失,必须显式处理成员初始化。

  3. 你解决方法的合理性
    手动添加显式构造函数并在初始化列表中完成成员绑定(比如将引用成员绑定到std::cin),完全符合C++标准要求,这也是第2版代码的处理方式——第2版可能没有依赖PPP.h的隐藏逻辑,而是直接显式定义了构造函数。

举个简单的构造函数示例:

class Token_stream {
private:
    std::istream& input;
public:
    // 显式构造函数,将引用成员绑定到标准输入流
    Token_stream() : input(std::cin) {}
    // 类的其他成员函数...
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:29:59