c++ - 预构造函数初始化

标签 c++ constructor initialization

我的问题是这样的,我有一个名为“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/

相关文章:

c++ - 作为类成员的 `std::array<int, N>`中的元素是否默认初始化

c++ - 这个函数 “a::b::ptr function(value)”调用在C++中如何工作?

c++ - 是首先调用 init 部分函数还是构造函数?

java - 基于SCJP(EXAM 310-065)程序的疑问

JavaScript 全局 boolean 变量将自身转换为字符串

java - 为什么可以使用增强的 for 循环更改字段变量但不能初始化对象?

c++ - 将 3D 数组( vector )转换为 vtk 非结构化网格

C++ 类 Typedef 结构不命名类型

c++ - 类模板构造函数中的 SFINAE

c++ - 为什么我的基类构造函数之一被删除? (C++11)