在头文件中初始化数组的另一种方法,无需c++ 11
Alternative way to initialize arrays in Header file without C++11
我在头文件中创建了一个类,它创建并填充了三个数组,如下所示:
class ExampleClass {
private:
string array1[5] = {"test1", "test2", "test3", "test4", "test5"};
double array2[4] = {20.7, 26.4, 27.8, 31.1};
double array3[4] = {19.1, 25.8, 27.3, 32.3};
};
在构建时,我收到关于需要-std=c++11
或-std=gnu++11
工作的警告。它建立良好的工作方式,我想为我,但这是我应该担心的情况下,我要把它包括在一个单一的项目,例如?
是否有一个旧的替代方案可以做完全相同的事情,或者这只可能从c++ 11开始?
这是我应该担心的情况下,我要把它包括在一个单一的项目,例如?
如果你正在为一项任务写一个项目,你应该注意任务的要求。它应该指定代码必须在其上构建和运行的平台、编译器和构建标志。如果这些要求允许您使用c++ 11,那么您就可以了,如果不允许,那么您就必须寻找替代方案。要记得在阅卷员将要使用的平台、编译器等上测试你的作业。
是否有一个旧的替代方案可以做完全相同的事情,或者这只可能从c++ 11开始?
在c++ 11之前没有完全相同的选项;在c++ 11之前,不可能为成员数组指定初始化式。最接近的方法是允许进行默认初始化,然后在构造函数中重新初始化数组:
struct S {
string array1[5];
S() {
string init_values[5] = {"test1", "test2", "test3", "test4", "test5"};
for (int i=0; i<5; ++i) {
array1[i] = init_values[i];
}
}
};
c++ 11引入统一初始化:
struct S {
string array1[5];
S() : array1{"test1", "test2", "test3", "test4", "test5"}
{}
};
和类内初始化:
struct S {
string array1[5] {"test1", "test2", "test3", "test4", "test5"};
};
如果您只从数组中读取(如您在评论中所说),请添加const
。
注意:没有const
,当您开始修改值时,以下将无法正常工作!
下面是我能想到的最好的c++ 03。虽然您可以将所有内容放入头文件,但我认为这不是一个好主意。我将展示如何使用头文件和实现文件来实现它。如果你真的需要头文件中的所有内容,并且你不知道如何修改下面的代码,请询问。
我们首先创建一个头文件foo.hpp
:
#ifndef FOO_HPP
#define FOO_HPP
#include <string>
class ExampleClass {
private:
const std::string (&array1)[5];
const double (&array2)[4];
const double (&array3)[4];
ExampleClass(); // you need ctors to initialize the non-static members
};
#endif // FOO_HPP
现在您有了头文件,创建实现文件foo.cpp
:
#include "foo.hpp"
namespace
{
const std::string global_array1[5] = {"test1", "test2", "test3", "test4", "test5"};
const double global_array2[4] = {20.7, 26.4, 27.8, 31.1};
const double global_array3[4] = {19.1, 25.8, 27.3, 32.3};
}
// define your ctor(s)
ExampleClass::ExampleClass()
: array1( global_array1 ),
array2( global_array2 ),
array3( global_array3 )
{}
相关文章:
- 使用基类中的派生方法运行线程,而无需使用模板
- 快速方法可以将整数乘以适当的分数,而无需浮点或溢出
- 自动将 std::string 转换为 char* 而无需每次都调用 c_str() 的最佳方法
- C ++实现全局开关/标志以控制程序行为的最佳方法,而无需将类绑定到公共点
- 在派生类中调用基类方法,而无需指定基类名称
- C 将方法和字段带入外部范围,而无需明确的参考
- 是否有一种方法可以避免标头文件中使用的constexpr函数输入全局范围,而无需额外的名称空间
- 一种无需使用if语句而无需使用阈值的方法
- 将整数添加到数组值而无需调用它的最安全方法
- 寻找一种在运行时检测 valgrind/memcheck 的方法,而无需包含 valgrind 标头
- 复制列表类的构造函数,而无需在实现中使用任何方法
- 在 android 上从 Java 调用C++类方法或函数,而无需在每次调用时重新创建类/变量
- 是否有一种方法可以让公共成员在班级外部无法解码,而无需访问包装器功能
- 在C 中,是否有一种(新的)方法来测试类是否在模板中具有虚拟破坏者而无需实例化实例
- C ,最有效的方法将大写速度更改为小写,反之亦然,而无需条件分支
- 任何无需复制即可从 std::ostringstream 获取 std::string_view 的方法
- 静态内联方法无需静态成员初始化
- 将对象分配给C 的预定义地址,而无需放置新方法
- C 杀死方法无需不断检查标志
- 反向调用,从本机 C/C++ DLL 调用 C# 对象的方法,而无需 CLI/CLR