我正尝试在c ++中创建一个类,以调用该类来存储一些参数的值,这些参数被组织为“行星”类和“卫星”类的成员变量,我想通过引用实例来对其进行初始化'行星'。在这里,我提供一个示例,其中有一个“ PlanetCatalog”类, 成员变量“行星海王星”和“卫星海卫一”。
class Planet {
public:
double a;
Planet() {}
void setParams( const double a_) {
a = a_;
}
};
class Satellite {
public:
double b;
Planet & planet;
Satellite( Planet & planet_):planet(planet_) { }
void setParams(const double b_) {
b = b_;
}
};
class PlanetCatalog {
public:
Planet neptune;
Satellite triton(neptune);
void setAll() {
neptune.setParams(1.);
triton.setParams(2.);
}
};
但是,在编译时遇到错误。
error: unknown type name 'neptune'
Satellite triton(neptune);
是否有可能像我在此处那样将Planet和Satellite存储为同一类的变量。如果不是,那么有人可以建议用c ++更好地组织此功能的方法吗?
答案 0 :(得分:2)
使用括号进行类内初始化使编译器将triton
视为非静态成员函数声明,其中neptune
是第一个参数的类型,应使用 list-initialization < / em>语法代替:
Satellite triton{neptune};
请注意,实际上不需要为此定义PlanetCatalog
构造函数。
答案 1 :(得分:1)
发生了什么事?
class PlanetCatalog { public: ... Planet neptune; Satellite triton(neptune); //<-- Compiler sees this as a non-static member-function declaration ...
由于该语句的上下文,编译器将其视为非静态成员函数声明,并尝试在相关的命名空间中找到名为neptune
的 type (s);因为找不到它,它发出一个错误。
选项1 :您可以定义一个构造函数,该构造函数在其member-initialization-list
中为您初始化triton
class PlanetCatalog {
public:
...
Planet neptune;
Satellite triton;
PlanetCatalog() : triton(neptune) {}
...
注意: :使用此选项order of your class data members matters,因为数据成员的顺序初始化由其在类中的声明顺序定义,而不是由member-initialization-list
选项2 :另一个简单的解决方案是使用copy-initialization
Satellite triton = neptune;
选项3 :或list-initialization
Satellite triton{neptune};
选项2和3是可取的,因为它隐式地强制声明顺序。