【问题标题】:c++: how is this a semantic errorc++:这是怎么一个语义错误
【发布时间】:2014-07-13 10:45:44
【问题描述】:

这种错误让我感到困惑......

代码:

class TankSystem
{
  //  
  // instance variables
  //  
  private:
    TankController _tlTank;
    TankController _trTank;
    TankController _blTank;
    TankController _brTank;

    Pump _leftPump;
    Pump _rightPump;

  //  
  // constructor methods
  //  
  public:
    TankSystem( TankSystemInfo info, PumpInfo left, PumpInfo right ) 
    {   
      _tlTank = TankController( info.tanks[0] );  
      _trTank = TankController( info.tanks[1] );
      _blTank = TankController( info.tanks[2] );  
      _brTank = TankController( info.tanks[3] );
      _leftPump = Pump( left );
      _rightPump = Pump( right );
    }

这里我有一个包含 6 个数据成员的系统:4 个坦克对象和 2 个泵对象。

我得到了这个错误...

include/TankSystem.hpp:32:5: 错误:'TankSystem' 的构造函数必须 显式初始化没有的成员 '_tlTank' 默认构造函数 TankSystem( TankSystemInfo 信息,PumpInfo 左侧,PumpInfo 右侧) ^ include/TankSystem.hpp:20:20: 注意:这里声明了成员 TankController _tlTank; ^ include/TankController.hpp:26:7: 注意:此处声明的“TankController”类 TankController

每个实例变量一次。所以我在这里总共得到6个错误...... 硬件:2011 11' MacBook Air

操作系统:OSX 10.9.3

编译器:Apple LLVM 5.1 版 (clang-503.0.40)

【问题讨论】:

  • 因为如果你的类有其他类的成员,它们将在构造函数之前被初始化。搜索“初始化列表”以获取更多信息。
  • 语法很好。

标签: c++ clang


【解决方案1】:

TankSystem对象被构造时,所有的字段在构造器主体被执行之前被初始化。因为TankController 没有默认构造函数(并且您没有显式调用任何其他构造函数)编译器无法实例化这些字段。

所以,而不是

TankSystem( TankSystemInfo info, PumpInfo left, PumpInfo right ) 
{   
  _tlTank = TankController( info.tanks[0] );  
  _trTank = TankController( info.tanks[1] );
  _blTank = TankController( info.tanks[2] );  
  _brTank = TankController( info.tanks[3] );
  _leftPump = Pump( left );
  _rightPump = Pump( right );
}

TankSystem( TankSystemInfo info, PumpInfo left, PumpInfo right ) :
   _tlTank(info.tanks[0]), _trTank(info.tanks[1]), _blTank(info.tanks[2]),
   _brTank(info.tanks[3]), _leftPump(left), _rightPump(right)
{   
}

即使你有默认构造函数,你也应该使用 b) 解决方案,因为在这种情况下 a) 对象将首先由默认构造函数初始化,然后将执行 TankController(info.tanks[0]) 构造函数创建一个临时对象,然后 @将调用 987654326@ 将临时对象中的值复制到现有对象中。

【讨论】:

    【解决方案2】:

    首先,修复:

    TankSystem( TankSystemInfo info, PumpInfo left, PumpInfo right ) 
    : _tlTank( info.tanks[0] ),
      _trTank( info.tanks[1] ),
      _blTank( info.tanks[2] ),
      _brTank( info.tanks[3] ),
      _leftPump( left ),
      _rightPump( right )
    {
    }
    

    这应该使您的代码编译。

    至于原因,C++要求成员变量在进入构造函数体之前进行初始化,这就需要使用一个初始化列表。您的代码使用赋值,如果您的 TankControllerPump 类具有默认构造函数,这会很好:您的代码将在进入 TankSystem::TankSystem 的主体之前调用默认构造函数;然后它将重新分配值。但是,这两个类都缺少默认构造函数,从而触发了错误。

    【讨论】:

      【解决方案3】:

      因为当你的构造函数中的代码开始时,字段应该已经初始化了,但这是不可能的,因为没有默认构造函数。请改用初始化列表。

      【讨论】:

        猜你喜欢
        • 2015-12-09
        • 2021-12-05
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-09
        相关资源
        最近更新 更多