除了一个值

时间:2017-05-09 16:33:20

标签: c++ struct default-value

这肯定与其他一些已被回答的问题有关,但我无法从他们的具体案例中得出答案,主要是因为我实际上并不是程序员;我只是一个碰巧必须编写代码的工程师。

以下是这种情况:

  • 我有一堆变量,我想一起收集,可能是一个结构。
  • 除了两个以外,我想初始化为零;需要将两个特定变量(不要碰巧是前两个)初始化为一个。
  • 实际名称是唯一且有意义的,使用矢量不合适,此外还有一些双打。为了清楚起见,我将下面的示例简单化了。
  • 由于我正在进行的项目,我一直坚持使用C ++ 98,所以即使C ++ 11有更优雅的解决方案,他们也不会为我工作。< / LI>

我正在考虑结构本身的这些方面:

struct allFlags
{
    int flagAA;
    int flagAB;
    int flagAC;
    int flagAD;
    int flagAE;
    // ...
    // there's about 100 variables total
    // ...
    int flagZZ;
};

我希望将所有标志初始化为0,但flagADflagAE除外,它应为1。

首先,我不确定是否应该使用typedef struct allFlagsstruct allFlags。接下来,我不确定是否应该创建一个构造函数(我认为只适用于没有typedef的情况?)或者在实例化结构时使默认值发生。我见过这样的事情(将放在结构定义中):

    allFlags() : flagAD(1), flagAE(1) { /*not sure of I'd need anything here*/ }

但我不想在构造函数体中按名称单独列出所有其他~98个变量,将它们设置为零。我也看到使用memset的东西可能有所帮助,但我不确定最好的方法。

最后一个相关的问题是如何实际声明我的结构实例(这会产生我想要的初始值)。看起来有时struct会使用new关键字进行实例化,有时候它更像是基本数据类型,即我在搜索中看到过这两种情况:

allFlags flagset1;
flagset2 = new allFlags;

我也看到过这样的语法,而不是使用构造函数:

allFlags flagset3 = {}; // to zero all fields first
flagset3.flagAD = 1;
flagset3.flagAE = 1;

但我宁愿让实例化尽可能简洁明了。

请原谅这个问题。我在尝试之前尝试过做作业,但我的C ++知识充其量是平庸的,所以我发现一些看似相关的答案我要么完全不理解,要么只是提出更多问题。

2 个答案:

答案 0 :(得分:2)

你很好地回答了自己的问题:

allFlags flagset3 = {}; // to zero all fields first
flagset3.flagAD = 1;
flagset3.flagAE = 1;

很干净,你的意图非常明确。之后,当其他人必须阅读您的代码时,他们将准确理解您要执行的操作。

它类似于您在设备驱动程序编程中看到的内容:

registerX = 0 | 1 << BIT2 | 1 << BIT3;

答案 1 :(得分:2)

如果您对使用模板感到满意,可以使用类模板自动清除allFlags的所有成员变量的初始化。

// class template to help initialize members cleanly.
template <typename T>
struct flag
{
   // Constructors
   flag() : val(0) {}
   flag(T const& v) : val(v) {}

   // Automatic cast operators to T
   operator T& () { return val; }
   operator T const& () const { return val; }

   // Comparison operators
   bool operator==(flag const& rhs) const { return val == rhs.val; }
   bool operator!=(flag const& rhs) const { return val != rhs.val; }
   bool operator<(flag const& rhs) const { return val < rhs.val; }

   T val;
};

typedef flag<int> IntFlag;
typedef flag<double> DoubleFlag;

struct allFlags
{
   // Initialize all flags bug flagAD to zero.
   allFlags() : flagAD(1) {}

   IntFlag flagAA;
   IntFlag flagAB;
   IntFlag flagAC;
   IntFlag flagAD;
   IntFlag flagAE;
   IntFlag flagZZ;
};

#include <iostream>

int main()
{
   allFlags f;
   std::cout << f.flagAA << " " << f.flagAD << std::endl;
}

输出:

0 1