2012-07-06 83 views
0

我有一个配置类,我想传递给另一个类(称为使用)在构造函数中。我想将配置类作为私有成员变量存储在Use类中。我希望它是const。如何传递一个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_,但每当我试图在混乱的编译错误结束的方式。我该怎么做?

+0

什么编译错误? – 2012-07-06 17:23:59

回答

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实例之一,那么非参考解决方案可能是比较合适的

+1

拍摄一份副本会更安全,除非您可以保证参考文献在施工后仍然有效。 – 2012-07-06 17:26:20

+1

@MikeSeymour它取决于方案,肯定有副本不正确的情况。是的,用户应该在这里澄清,虽然 – JaredPar 2012-07-06 17:27:33

+0

@JaredPar,副本总是适当的,而参考通常不会。可以指出它是一种替代方法,但你确实需要说明这些注意事项。 – 2012-07-06 17:29:09

3

由于成员是const,所以您的构造函数不能分配给它。但是,它可以从它的初始化器列表直接初始化它:

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

你应该使用初始化在构造函数的值赋给利弊成员

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

@MikeSeymour对不起,这是一个打字错误:) – Mohammad 2012-07-06 17:28:19

0

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

0

不能分配给const,但你可以在基体初始化列表初始化:

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