c ++ 98结构默认为零,除了一个值
c++98 struct default to zero except one value
这当然与其他一些已经回答的问题有关,但我无法从他们那里得出我的具体案例的答案,主要是因为我实际上不是程序员;我只是一个碰巧需要写一些代码的工程师。
情况如下:
- 我有一堆变量想收集在一起,可能会收集到一个结构中。
- 除了两个我想初始化为零;需要将两个特定变量(恰好不是前两个变量)初始化为一个。
- 实际名称是唯一且有意义的,因此使用矢量是不合适的,而且其中也有一些双打。为了清楚起见,我在下面的示例中保持简单。
- 因为我正在做的项目,我坚持使用 C++98,所以即使 C++11 有更优雅的解决方案,它们也不适合我。
我正在为结构本身考虑这些方面的问题:
struct allFlags
{
int flagAA;
int flagAB;
int flagAC;
int flagAD;
int flagAE;
// ...
// there's about 100 variables total
// ...
int flagZZ;
};
我想将除 flagAD
和 flagAE
之外的所有标志都初始化为 0,它们应该是 1。
所以首先,我不确定我应该使用typedef struct allFlags
还是struct 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++ 知识充其量只是平庸,所以我发现一些看似相关的答案我要么没有完全理解,要么只是提出了更多问题。
你很好地回答了自己的问题:
allFlags flagset3 = {}; // to zero all fields first
flagset3.flagAD = 1;
flagset3.flagAE = 1;
很干净,很清楚你的意图。稍后,当其他人必须阅读您的代码时,他们将准确理解您要做什么。
这类似于您在设备驱动程序编程中看到的内容:
registerX = 0 | 1 << BIT2 | 1 << BIT3;
如果您习惯使用模板,可以使用 class 模板来自动完成 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
这当然与其他一些已经回答的问题有关,但我无法从他们那里得出我的具体案例的答案,主要是因为我实际上不是程序员;我只是一个碰巧需要写一些代码的工程师。
情况如下:
- 我有一堆变量想收集在一起,可能会收集到一个结构中。
- 除了两个我想初始化为零;需要将两个特定变量(恰好不是前两个变量)初始化为一个。
- 实际名称是唯一且有意义的,因此使用矢量是不合适的,而且其中也有一些双打。为了清楚起见,我在下面的示例中保持简单。
- 因为我正在做的项目,我坚持使用 C++98,所以即使 C++11 有更优雅的解决方案,它们也不适合我。
我正在为结构本身考虑这些方面的问题:
struct allFlags
{
int flagAA;
int flagAB;
int flagAC;
int flagAD;
int flagAE;
// ...
// there's about 100 variables total
// ...
int flagZZ;
};
我想将除 flagAD
和 flagAE
之外的所有标志都初始化为 0,它们应该是 1。
所以首先,我不确定我应该使用typedef struct allFlags
还是struct 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++ 知识充其量只是平庸,所以我发现一些看似相关的答案我要么没有完全理解,要么只是提出了更多问题。
你很好地回答了自己的问题:
allFlags flagset3 = {}; // to zero all fields first
flagset3.flagAD = 1;
flagset3.flagAE = 1;
很干净,很清楚你的意图。稍后,当其他人必须阅读您的代码时,他们将准确理解您要做什么。
这类似于您在设备驱动程序编程中看到的内容:
registerX = 0 | 1 << BIT2 | 1 << BIT3;
如果您习惯使用模板,可以使用 class 模板来自动完成 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