预构造函数初始化

时间:2015-05-13 17:41:29

标签: c++ constructor initialization

我的问题是这样的,我有一个名为" Product"另一个名为"农业","农业" class继承了"产品"类。

当我召唤农业"构造函数显然是"产品"构造函数首先被召唤。

问题是,我可以先通过set方法初始化其中一个产品的成员吗?

2 个答案:

答案 0 :(得分:3)

如果你有:

class Product { ... };
class Agriculture : public Product { ...}; 

您无法逃避在派生对象之前构造基础对象的标准规则。您没有机会干预此顺序,也不会在Product之前在其构造函数启动之前设置任何内容。

<强>建议:

您需要的最佳设计是预见Product构造函数,该构造函数将您想要设置的值作为附加参数:

 class Product {
     string origin; 
 public:  
     Product () : origin("tbd") { } 
     Product (string withorigin) { ...}
     void setOrigin (string myorigin) { origin=myorigin; }  
 };
 class Agriculture : public Product {
 public: 
     Agriculture () : Product ("Earth") { ...} 
 };

解决方法:

如果这样的设计不符合您的需求,那么您唯一能想到的就是在Product中拥有一个静态成员。该成员将独立于任何Product,因此可以在构造对象之前设置。

 class Product {
     static string defaultCurrency; 
     string currency;
 public:  
     Product () : currency(defaultCurrency) { ... } 
     static void setDefaultCurrency (string cur) { defaultCurrency=cur; }  
 };
 class Agriculture : public Product { ...  };

 int main() {
     Product::setDefaultCurrency("EUR"); 
     Agriculture a1; 
 }

它更容易出错:施工结果取决于与施工无关的操作顺序。这可能是一个问题,例如在多线程的情况下,如果多个线程在同一时刻构造对象。

答案 1 :(得分:1)

首先调用产品构造函数,然后在此构造函数中设置一些值。那么为什么你仍然想首先通过set方法初始化产品的一个成员呢?