C++ 如何";轨道“;缺少ctor初始化列表参数?

C++ 如何";轨道“;缺少ctor初始化列表参数?,c++,constructor,initialization,C++,Constructor,Initialization,我相信每个人都会不时地面对一些丑陋的东西 问题是在一个类中再添加一个字段,而忘记了展开初始化列表,例如: class T{ private: field1; ... field10; }; T::T( int speedValue ): field1( Speed::MphToMps(speedValue) ), field2( new OtherClass(14,5,15) ), field3( PublicValueGenerator::generateNewF

我相信每个人都会不时地面对一些丑陋的东西

问题是在一个类中再添加一个字段,而忘记了展开初始化列表,例如:

class T{
  private:
    field1;
    ...
    field10;
};

T::T( int speedValue ):
field1( Speed::MphToMps(speedValue) ),
field2( new OtherClass(14,5,15) ),
field3( PublicValueGenerator::generateNewFieldValue(0,15) ),
...,
field10( "unpredictable value" );
如果我匆忙地添加了一些字段,比如newForgottenField,有时我会忘记设置init值。 我记得有些IDE可以给出提示,但vim+插件是我的选择:)

因此,有一些提示可以简化跟踪这种情况,或者有一些经验法则或粗鲁的宏会给出警告或编译时错误(那将是惊人的:)? 你如何克服这个障碍


<诚挚的问候语

< p>如果你使用G+,那么它提供了一个选项,它允许对Scott Meyer有效C++中的准则违反的结构进行警告:
选择是:

-Weffc++ 

请注意,它还将启用许多其他警告。此外,并非所有的标准库标题都遵循Meyers Guillideline。

获得所需内容的一种方法是确保所有字段都是类的实例,这些类要么具有执行所需操作的默认构造函数,要么仅具有需要参数的构造函数


<>这并不总是方便的,但是它肯定会解决你的问题。

< P>这是一个很好的问题,而且可以很容易地检查,但是一般来说,C++的解决方案实际上支持错误倾向、冗长和混淆,这使得它们比你试图解决的问题更具趣味性。不过,为了便于讨论,这里有一些方法

您可以创建没有默认构造函数的类:

template <typename T>
class Explicitly_Initialised
{
  public:
    Explicitly_Initialised(const T& t) : t_(t) { }
    T& operator T() { return t_; }
    const T& operator T() const { return t_; }
  private:
    T t_;
};
模板
类显式初始化
{
公众:
显式初始化(常量T&T):T(T){
T运算符T(){return T_;}
常量T&运算符T()常量{return T}
私人:
T!;
};
或者,您可以有一个类,如果在给定值之前从中读取对象,则抛出该类(如果您有这样的概念,可能仅在“调试”构建中)。您可以决定
运算符=
中的值是否正常。您需要一个
bool已初始化\u成员以跟踪此,在默认构造函数中设置为false。一个麻烦是
operator T()
在写入变量之前不知道变量是否即将被读取,因此要完成一项彻底的工作,您可能需要一个代理对象来管理这种情况:痛苦


或者,由于太混乱而无法推荐—您可能会将一个接受类型列表的类拼凑在一起,每个类型都有一个成员对象,并且在构造函数中坚持使用匹配列表;允许泛型类接受用于访问数据成员的普通任意标识符是很困难的(如果类型是唯一的,则很容易允许数字访问,甚至基于类型的访问)(您可能会让它与宏hackery一起工作).

在C++11中解决此问题的最简单方法是为所有原语成员提供元素初始值设定项:

class T {
private:
    int field1{};
    ...
    int field10{};
};

是“上帝级错觉”吗?你想如何“追踪”他们?由编译器发出警告/错误?靠vim本身?通过外部分析程序?如果这是您经常犯的错误,请将其添加到您的检查表中。这是杀手级功能!看来,这正是我梦寐以求的。以前从没听说过。。。