我应该在构造函数中调用成员函数
我知道这是一个相当简单的问题,也取决于代码的其余部分,但我对经验法则更感兴趣。我应该在构造函数中调用成员函数
那么在什么情况下在构造函数中调用函数是合适的呢?
最好的是:
ClassA obj1;
obj1.memFun();
或
ClassA obj1;
//where constructor of ClassA is
ClassA::ClassA(){ memFun(); }
这是没有伤害到你的构造函数中调用一个成员函数。但是,确保成员函数是非虚拟的,因为动态绑定机制在构造函数完成后启动。如果memFun
是虚拟的,并在其子类中重写,然后调用memFun
将结合ClassA::memFun
这就是我想听到:) – TheGuyWithStreetCred 2014-10-20 11:18:47
@ user2202368接受答案? – 2014-10-20 11:20:18
我打算这样做 – TheGuyWithStreetCred 2014-10-20 11:22:31
一个构造函数的任务是有效的,可用的状态,以创建一个对象。因此,如果需要您的函数调用来使对象的实例有效,请在构造函数中调用它。
不要在您的构造函数中调用virtual
方法,但它可能会导致问题。
谢谢,混淆了:) – TheGuyWithStreetCred 2014-10-20 11:19:10
@nvoigt除了调用虚拟方法之外,还有其他问题吗? – user2079303 2014-10-20 11:21:40
在构造函数中调用任何成员函数通常是安全的,因为在执行第一行用户代码之前已经完全设置了对象。但是,在构造或销毁期间,成员函数对抽象基类调用虚拟成员函数可能是不安全的。
谢谢,我会在处理继承时避免这种情况 – TheGuyWithStreetCred 2014-10-20 11:19:56
如果memFun
是虚拟的,你确实需要调用它的对象被完全建立,可以考虑使用一个工厂方法。例如:
static ClassA* makeX(){
ClassA* pObj = new ClassX(); // ClassX is a subclass of ClassA.
pObj->memFun();
return pObj ;
}
然后使ClassA和ClassX构造函数受到保护。
从概念上讲,它可能不是最好在构造函数中调用public成员函数,因为它暗示构造函数不仅仅是初始化和创建对象。然而,拥有私有成员函数应该没问题,因为它们不是该类的接口的一部分,并且可以被视为构造函数的辅助函数。
取决于。如果'memfun()'被声明为'虚拟',你不应该这样做。 – 2014-10-20 11:07:12
如果您详细说明memFun的功能,我们可以提供更具体的建议。例如,其逻辑可能适用于初始化列表。 – 2014-10-20 11:18:06