预构造函数初始化

Pre-constructor initialization

我的问题是这样的,我有一个名为 "Product" 的 class 和另一个名为 "Agriculture" 的 class,"Agriculture" class正在继承 "Product" class.

当我调用 "Agriculture" 构造函数时,显然首先调用 "Product" 构造函数。

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

如果你有:

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; 
 }

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

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