如何在C++中为私有静态成员编写init/cleanup代码
How to write init/cleanup code for private static members in C++?
使用简单的值,没有问题:我们只需在.cpp文件中设置它们。
但请考虑以下需要一些init/cleanup代码的示例:
// .h
class MyClass {
...
private:
static unsigned First1000Primes[1000];
} ;
在.cpp文件中,我们想要初始化数组,并且需要一些代码。
我们可以在.cpp文件中定义一个类Initializer,并使用一个填充值的ctor,并在同一文件中声明一个静态Initializer InitAndCleanup 这个解决方案的问题是它的"混乱",因为初始化器必须是MyClass的朋友才能访问它的私有部分。 所以我的问题是:有更清洁的方法吗?
请改用std::array
。
class MyClass {
...
private:
static std::array<unsigned, 1000> First1000Primes;
} ;
现在初始化的问题是一个简单的lambda
std::array<unsigned, 1000> MyClass::First1000Primes = [&] {
std::array<unsigned, 1000> primes;
// fill primes
return primes;
}();
您可以使用初始化静态的正常方式:
unsigned MyClass::First1000Primes[] = {2,3, /*...*/};
在实现文件中。我可以建议你用std::vector
吗?
我想说,就像其他一切一样,这只是封装和封装的问题。
struct PrimeArray {
PrimeArray(); // init here
PrimeArray(PrimeArray const&) = delete;
PrimeArray& operator=(PrimeArray const&) = delete;
~PrimeArray(); // cleanup here
unsigned data[1000];
};
然后使用
class MyClass {
public:
// ...
private:
static PrimeArray const primes;
};
并像往常一样在cpp中初始化:
PrimeArray const MyClass::primes{};
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- GCC对可能有效的代码抛出init list生存期警告
- 我在哪里定义代码来释放在C Python模块init函数中分配的资源
- 如何在C++中为私有静态成员编写init/cleanup代码