在main.cpp以外的文件中定义静态数组

时间:2013-12-18 00:14:22

标签: c++ arrays

我想有一个口袋妖怪物种结构的静态数组,数组中的每个索引都包含每个口袋妖怪的名称及其捕获率。我正在尝试在名为SpeciesList.hpp的文件中声明并定义它。

#ifndef SPECIESLIST_HPP
#define SPECIESLIST_HPP

#include "Species.hpp" // In which the struct species is defined as 
                       // struct species {
                       //     std::string name;
                       //     int catchRate;
                       // };

static species speciesList[719];
speciesList[1].name = "Bulbasaur";
speciesList[1].catchRate = 45;
speciesList[2].name = "Ivysaur";
speciesList[2].catchRate = 45;
// Hundreds of others...

#endif // SPECIESLIST_HPP

当我不在我的main.cpp文件中包含SpeciesList.hpp时,该代码编译没有任何问题。此外,当我在我的SpeciesList.hpp文件中使用前面的speciesList声明时,它也会编译,在main.cpp文件中包含SpeciesList.hpp文件,并在main.cpp文件中定义speciesList而不是SpeciesList.hpp文件。但是,当我尝试使用上述声明和定义时,我会收到这些错误

error: C++ requires a type specifier for all declarations
speciesList[1].name = "Bulbasaur"; // With speciesList underlined.

error: expected ';' after top level declarator
speciesList[1].name = "Bulbasaur"; // With the dot operator being pointed to.

error: C++ requires a type specifier for all declarations
speciesList[1].catchRate = 45; // speciesList underlined again.

error: expected ';' after top level declarator
speciesList[1].catchRate = 45; // Dot operator pointed to again.

问题在标题中。

2 个答案:

答案 0 :(得分:0)

这是因为您不能在该上下文中使用speciesList[1].name = "Bulbasaur";之类的表达式。如果您想在编译时定义整个数组,可以这样声明:

static const species speciesList[] = {
    { "Bulbasaur", 45 },
    // etc.
};

但请注意,这会将Bulbasaur置于数组的索引0处。

为了提高可读性和可扩展性,您可以为结构定义构造函数,如下所示:

struct species {
    std::string name;
    int catchRate;

    species(const std::string &n, int c)
      : name(n), catchRate(c)
    {
    }
};

然后声明你的数组:

static const species speciesList[] = {
    species("Bulbasaur", 45),
    // etc.
};

答案 1 :(得分:0)

如果你有C ++ 11可用,你可以像这样初始化数组:

static species speciesList[719] = {
 {"Bulbasaur", 45},
 {"Ivysaur", 45},
 ...
 };

在C ++ 11中查找统一初始化。

如果您无法使用此功能,但可以访问Boost,则可以使用Boost Assign库执行此类操作(请注意,我现在无法检查,但这是个主意):< / p>

static species speciesList[719] = boost::assign::array_of<species>
  ("Bulbasaur", 45)
  ("Ivysaur", 45)
  ...;