我的问题是,我有一个叫做“产品”的类,还有一个叫“农业”的类,“农业”类继承了“产品”类。
显然,当我调用“农业”构造函数时,首先调用"Product“构造函数。
问题是,我能否首先通过一个集合方法初始化产品的一个成员?
发布于 2015-05-13 17:49:26
如果你有:
class Product { ... };
class Agriculture : public Product { ...};
不能转义基对象在派生对象之前构造的标准规则。在Product
的构造函数启动之前,您没有机会干预这个顺序,也没有机会在它中设置任何东西。
Recommendation:
为了满足您的需要,最好的设计是预见一个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;
}
它更容易出错:施工结果取决于与施工无关的操作顺序。这可能是一个问题,例如,在多线程情况下,如果多个线程同时构造对象。
发布于 2015-05-13 18:17:31
首先调用产品构造函数,然后在此构造函数中设置一些值。那么,为什么您仍然希望先通过set方法初始化产品的一个成员呢?
https://stackoverflow.com/questions/30221816
复制相似问题