C++ 预构造函数初始化
我的问题是这样的,我有一个名为“Product”的类和另一个名为“Agriculture”的类,“Agriculture”类继承了“Product”类 当我召唤“农业”建造师时,显然是先召唤“产品”建造师 问题是,我可以先通过set方法初始化产品的一个成员吗?如果您有:C++ 预构造函数初始化,c++,constructor,initialization,C++,Constructor,Initialization,我的问题是这样的,我有一个名为“Product”的类和另一个名为“Agriculture”的类,“Agriculture”类继承了“Product”类 当我召唤“农业”建造师时,显然是先召唤“产品”建造师 问题是,我可以先通过set方法初始化产品的一个成员吗?如果您有: class Product { ... }; class Agriculture : public Product { ...}; 您不能逃避标准规则,即基本对象是在派生对象之前构造的。您没有机会在此顺序中进行干预,也没有机
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所强调的),该参数指示您构建的产品系列的类型。这满足了您的需要,并采用了一种可接受的方式。然而,这引入了基类对其派生类的依赖性,这也不是一个好的设计实践。您应该发布另一个问题,其中包含更多代码,并描述产品结构之间的差异。也许还有另一种方法可以实现这一点。如果您想“每当我构建一种产品类型时,我希望该产品的构造函数对每种类型的行为都有所不同”,您可以在产品中定义一个虚拟函数,然后实现