在没有C ++ 11的情况下初始化Header文件中的数组的替代方法

时间:2013-02-26 19:48:11

标签: c++ arrays c++11 header-files

我在头文件中创建了一个类,它创建并填充三个数组,如下所示:

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工作。它构建得很好并且可以满足我对我的需求,但这是我应该担心的事情,以防我将它包含在一个uni项目中吗?

是否有一个较旧的替代品完全相同,或者只能从C ++ 11获得?

2 个答案:

答案 0 :(得分:1)

如果您只是从数组中读取(正如您在评论中所述),请添加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 )
{}

答案 1 :(得分:1)

  

这是我应该担心的事情,以防我将它包含在uni项目中吗?

如果您正在为作业编写项目,则应注意作业的要求。它应该指定代码必须构建和运行的平台,编译器和构建标志。如果这些要求允许你使用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"};
};