我的问题是这样的,我有一个名为" Product"另一个名为"农业","农业" class继承了"产品"类。
当我召唤农业"构造函数显然是"产品"构造函数首先被召唤。
问题是,我可以先通过set方法初始化其中一个产品的成员吗?
答案 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方法初始化产品的一个成员呢?