繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM