我的问题是这样的,我有一个名为“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;
}
更容易出错:构造结果取决于与构造无关的操作顺序。这可能是一个问题,例如在多线程的情况下,如果多个线程同时构造对象。
关于c++ - 预构造函数初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30221816/