【问题标题】:Initialize 100 class data members to zero [duplicate]将100个类数据成员初始化为零[重复]
【发布时间】:2016-05-09 11:44:38
【问题描述】:

有没有办法初始化具有用户定义构造函数的类的所有数据成员?

class CTest
{
private: 
    int a = 0;
    BYTE b; CHAR* c; int d; int e; int f; int g;
public:
    CTest() b:(0)
    {
        c = 0;
    }
};

假设我的班级有 100 个数据成员,我想将它们全部初始化为零。

一个接一个地做并不是最优的。我现在使用的解决方法是:我将所有这 100 个数据成员放在一个结构中,该结构是我的类的基础

喜欢

class : public base_with_all_members

当我想重置所有成员时,我只需在构造函数或initialize() 函数中执行以下操作。

*dynamic_cast<base_with_all_members*>(this) = {};

正确清除所有成员。

【问题讨论】:

  • 我的意思是:*dynamic_cast(this) = {};
  • 为什么你的班级一开始就有这么多成员?听起来是个坏主意。
  • 我第二个 @BaummitAugen 的评论。具有这么多成员的类是不可维护的设计。你刚刚遇到了第一个方面。与其寻找技术解决方案,不如考虑另一种设计。
  • @Jose 如果是这样,那么您应该在问题中提到所有这些要求。
  • 我赞同前面的人所说的话。您那时不太了解C++这一事实没有理由不重构现在

标签: c++


【解决方案1】:

在这种情况下,最简单的可能是使用较新的语法进行默认值初始化。当然,在输入时间方面它可能“不是最佳的”,但生成的代码应该是可比较的。

class CTest
{
private: 
    int a = 0;
    BYTE b = 0;
    CHAR* c = nullptr;
    int d = 0;
    int e = 0;
    int f = 0;
    int g = 0;
public:
    CTest(): d(42)
    // initialiser list only needed is this particular
    // constructor doesn't initialise the value to 0
    {
    }
};

另一种选择是将数据成员移植到 POD 样式的“数据结构”,然后在类的构造函数中对其进行初始化;

struct POD {
  int a;
  int b;
  std::unique_ptr<int> c;
  // etc.
};

class CTest {
  POD data_ = { };
};

其他替代方法可能包括使用 static of the above POD data 结构来初始化成员 POD。


您在 cmets 中提到您有 一些无法复制(但大概可以移动)的数据成员,并且您也在寻找某种形式的“重置”功能. POD样本可以修改为;

class CTest {
  POD data_ = { };
public:
  void reset()
  {
    data_ = POD{}; // caters for moveable and copiable types
  }
};

Sample here.


附带说明;这是大量的数据成员。也许进一步的数据划分也是一个好主意。当然,我承认这可能是一个非常特殊的情况,但无论如何考虑一些重构可能是值得的。

【讨论】:

  • 希望编辑没问题,否则你可以回滚。
  • 我已经在使用第二种方法从 POD 数据结构中“分离”数据成员,原因是我可以随时重置它。我还提到了您对我的问题的第一种方法(您可以看到我确实以不同的方式设置了 a、b、c)。问题是,使用这种方法,我无法重置类,我必须删除它并创建一个新类(因为它具有互斥锁和无法复制的 uniqueptr),因此我不能只做 *myclassptr = {}。
  • @Jose,你能用std::move吗?然后,您可以将对象“移动”和“清空或重置”数据成员。
【解决方案2】:

为什么不这样?然后它会在一个位置供所有构造函数使用。

class Foo {
    public:
        Foo(): b(3) {}

    private:
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        int e = 0;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2015-03-22
    • 2020-02-25
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多