预构造函数初始化

Pre-constructor initialization

本文关键字:初始化 构造函数      更新时间:2023-10-16

我的问题是这样的,我有一个名为"Product"的类和另一个名为"Agriculture"的类,"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 方法初始化产品的一个成员呢?