0

我有一个配置类,我想在构造函数中传递给另一个类(称为 Use)。我想将配置类存储在 Use 类中作为私有成员变量。我希望它是常量。

到目前为止,我有这个代码:

class Configuration{
private:
    int value1_;
public:
    Configuration();
    Configuration(int value1){value1_=value1;}
    int value1() const {
        return value1_;
    }
};

class Use{
private:
    //const me
    Configuration config_;
    int something_;
public:
    Use(Configuration &config){
        config_=config;
    }

    void doSomething(){
        something_+=config_.value1();
    }
};

我想 const Use::config_,但我尝试的每一种方式都以令人困惑的编译错误告终。我该怎么做?

4

5 回答 5

3

由于成员是const,因此您的构造函数无法分配给它。但是,它可以直接从它的初始化器列表中初始化它:

Use(Configuration const & config) : config_(config) {}
于 2012-07-06T17:25:00.447 回答
2

支持这一点的最佳方法是使用参考

class Use{
private:
    const Configuration& config_;
    int something_;
public:
    Use(const Configuration &config) : 
      config_(config), 
      something_(0) {

    }

    void doSomething(){
        something_+=config_.value1();
    }
};

问题中需要更清楚的一项是实例之间Configuration的关系。Use如果有一个Configuration要在所有Use实例之间共享,那么参考(如我所述)是最合适的选择。在那种情况下,尽管您需要确保它比Configuration所有Use引用它的实例都长。

另一方面,如果Configuration每个实例都是一个,Use那么非参考解决方案可能更合适

于 2012-07-06T17:25:13.017 回答
0

您应该在构造函数中使用初始化程序为 cons 成员赋值

Use(Configuration &config)
: config_(config)
{
     ...
}
于 2012-07-06T17:25:16.117 回答
0

如果config被声明为const您的类的成员,您将无法在创建后对其进行修改。这包括在成员初始化列表中以外的任何尝试为其分配值。此外,当您尝试在其上调用其任何非成员函数时,const您将收到编译器错误。由于您尚未发布我在这里猜测的显式错误,这可能是您所拥有的,因为您的示例代码在它的实例上调用了该类的成员函数。

于 2012-07-06T17:26:13.250 回答
0

您不能分配给,const但可以在基本成员初始化程序列表中对其进行初始化:

class Use{
private:
    const Configuration config_;
public:
    Use(const Configuration & config)
        : config_(config)
    {
    }
};
于 2012-07-06T17:29:17.503 回答