2

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

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 中实现?

4

2 回答 2

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 )
{}
于 2013-02-28T21:07:07.650 回答
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"};
};
于 2013-02-28T21:21:22.193 回答