Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 预构造函数初始化_C++_Constructor_Initialization - Fatal编程技术网

C++ 预构造函数初始化

C++ 预构造函数初始化,c++,constructor,initialization,C++,Constructor,Initialization,我的问题是这样的,我有一个名为“Product”的类和另一个名为“Agriculture”的类,“Agriculture”类继承了“Product”类 当我召唤“农业”建造师时,显然是先召唤“产品”建造师 问题是,我可以先通过set方法初始化产品的一个成员吗?如果您有: class Product { ... }; class Agriculture : public Product { ...}; 您不能逃避标准规则,即基本对象是在派生对象之前构造的。您没有机会在此顺序中进行干预,也没有机

我的问题是这样的,我有一个名为“Product”的类和另一个名为“Agriculture”的类,“Agriculture”类继承了“Product”类

当我召唤“农业”建造师时,显然是先召唤“产品”建造师

问题是,我可以先通过set方法初始化产品的一个成员吗?

如果您有:

class Product { ... };
class Agriculture : public 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") { ...} 
 };
解决方法:

如果这样的设计不能满足您的需要,您唯一能想到的就是在
产品中有一个静态成员。然后,该成员将独立于任何
产品
,因此可以在构建对象之前进行设置

 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; 
 }
它更容易出错:构造结果取决于与构造无关的操作顺序。这可能是一个问题,例如在多线程的情况下,如果多个线程同时构造对象

如果您有:

class Product { ... };
class Agriculture : public 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") { ...} 
 };
解决方法:

如果这样的设计不能满足您的需要,您唯一能想到的就是在
产品中有一个静态成员。然后,该成员将独立于任何
产品
,因此可以在构建对象之前进行设置

 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; 
 }


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

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

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

no,但是您可以从构造函数中更改该值。或者考虑将参数添加到产品的构造函数中,这样您就可以传递正确的初始值。问题是相当模糊的。请注意用一个适当的编码示例来澄清它(换句话说,显示您的代码)。当然可以。在农业中使用构造器对产品父级进行适当的调用。我认为展示您想用一些代码做什么会对您有所帮助。不。还有你为什么要这么做。注意:在所有构造完成执行之前,虚拟函数不会正确工作,因此您无法访问派生类成员。不,但是您可以从构造函数中更改值。或者考虑将参数添加到产品的构造函数中,这样您就可以传递正确的初始值。问题是相当模糊的。请注意用一个适当的编码示例来澄清它(换句话说,显示您的代码)。当然可以。在农业中使用构造器对产品父级进行适当的调用。我认为展示您想用一些代码做什么会对您有所帮助。不。还有你为什么要这么做。注意:在所有构造完成执行之前,虚拟函数不会正确工作,因此您无法访问派生类成员。我有许多类型的产品(农业、日记等),我希望每当我构造一种类型的产品时,例如,我希望产品的构造器对每种类型都有不同的行为,我至少可以这样做吗?@AssafKaravani制作两个构造器我使用了你的建议,效果很好!非常感谢@AssafKaravani我可以想象,您使用enum参数使用我的建议(即第二个构造函数,如user3528438所强调的),该参数指示您构建的产品系列的类型。这满足了您的需要,并采用了一种可接受的方式。然而,这引入了基类对其派生类的依赖性,这也不是一个好的设计实践。您应该发布另一个问题,其中包含更多代码,并描述产品结构之间的差异。也许还有另一种方法可以实现这一点。我有许多类型的产品(农业、日记等),我希望每当我构建一种类型的产品时,例如农业,我希望产品的构建者针对每种类型采取不同的行动,“我至少可以这样做吗?”阿萨夫卡拉瓦尼说,我用了你的建议,成功了!非常感谢@AssafKaravani我可以想象,您使用enum参数使用我的建议(即第二个构造函数,如user3528438所强调的),该参数指示您构建的产品系列的类型。这满足了您的需要,并采用了一种可接受的方式。然而,这引入了基类对其派生类的依赖性,这也不是一个好的设计实践。您应该发布另一个问题,其中包含更多代码,并描述产品结构之间的差异。也许还有另一种方法可以实现这一点。如果您想“每当我构建一种产品类型时,我希望该产品的构造函数对每种类型的行为都有所不同”,您可以在产品中定义一个虚拟函数,然后实现