[英]C++: Initializing class member variable with reference to another class member variable?
我试图在c ++中创建一个类,以调用以存储许多参数的值,这些参数被组织为“行星”类和“卫星”类的成员变量,我想通过引用“行星”的实例进行初始化。 在这里,我提供一个示例,其中有一个“ PlanetCatalog”类,其成员变量为“ Planet neptune”和一个“ Satellite triton”。
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 ++更好地组织此功能的方法吗?
使用括号进行类内初始化使编译器将triton
视为非静态成员函数声明,且neptune
是第一个参数的类型,应改用list-initialization语法:
Satellite triton{neptune};
注意,实际上不需要为此定义PlanetCatalog
构造函数。
发生了什么?
class PlanetCatalog { public: ... Planet neptune; Satellite triton(neptune); //<-- Compiler sees this as a non-static member-function declaration ...
由于该语句的上下文,编译器将其视为非静态成员函数声明,并尝试在相关的名称空间中找到名为neptune
类型 ; 由于找不到它,因此发出错误。
选项1 :您可以在其member-initialization-list中定义一个构造函数,为您初始化triton
class PlanetCatalog {
public:
...
Planet neptune;
Satellite triton;
PlanetCatalog() : triton(neptune) {}
...
注意:使用此选项, 您的类数据成员的顺序很重要 ,因为数据成员的初始化顺序是由其在类中的声明顺序定义的,而不是由member-initialization-list
的初始化顺序定义的
选项2 :另一个简单的解决方案是使用复制初始化
Satellite triton = neptune;
选项3 :或列表初始化
Satellite triton{neptune};
选项2和3是可取的,因为它隐式地强制声明顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.