C ++:引用另一个类成员变量来初始化类成员变量?

时间:2018-11-09 20:21:33

标签: c++ constructor reference initialization

我正尝试在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 ++更好地组织此功能的方法吗?

2 个答案:

答案 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是可取的,因为它隐式地强制声明顺序。