我想有一个口袋妖怪物种结构的静态数组,数组中的每个索引都包含每个口袋妖怪的名称及其捕获率。我正在尝试在名为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.
问题在标题中。
答案 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)
...;