首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >预构造函数初始化

预构造函数初始化
EN

Stack Overflow用户
提问于 2015-05-13 17:41:28
回答 2查看 1.7K关注 0票数 1

我的问题是,我有一个叫做“产品”的类,还有一个叫“农业”的类,“农业”类继承了“产品”类。

显然,当我调用“农业”构造函数时,首先调用"Product“构造函数。

问题是,我能否首先通过一个集合方法初始化产品的一个成员?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-13 17:49:26

如果你有:

代码语言:javascript
运行
复制
class Product { ... };
class Agriculture : public Product { ...}; 

不能转义基对象在派生对象之前构造的标准规则。在Product的构造函数启动之前,您没有机会干预这个顺序,也没有机会在它中设置任何东西。

Recommendation:

为了满足您的需要,最好的设计是预见一个Product构造函数,该构造函数将要设置的值作为附加参数:

代码语言:javascript
运行
复制
 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,因此可以在构造对象之前进行设置。

代码语言:javascript
运行
复制
 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; 
 }

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

票数 3
EN

Stack Overflow用户

发布于 2015-05-13 18:17:31

首先调用产品构造函数,然后在此构造函数中设置一些值。那么,为什么您仍然希望先通过set方法初始化产品的一个成员呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30221816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档