如何传递const对象

时间:2012-07-06 17:22:15

标签: c++ const

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

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

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_,但我尝试的每一种方式都会导致混淆编译错误。我该怎么做?

5 个答案:

答案 0 :(得分:3)

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

Use(Configuration const & config) : config_(config) {}

答案 1 :(得分:2)

支持此功能的最佳方法是使用参考

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

    }

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

问题中需要更清楚一点的是ConfigurationUse个实例之间的关系。如果有一个Configuration意味着在所有Use实例之间共享,那么引用(如我所概述的)是最合适的选择。在这种情况下,您需要确保Configuration超过所有引用它的Use个实例。

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

答案 2 :(得分:0)

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

Use(Configuration &config)
: config_(config)
{
     ...
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您无法分配到const,但可以在基本成员初始值设定项列表中初始化它:

class Use{
private:
    const Configuration config_;
public:
    Use(const Configuration & config)
        : config_(config)
    {
    }
};