成员函数内的类实例化

时间:2011-05-12 18:11:51

标签: c++ oop recursion instantiation

在该类的成员函数中实例化一个类是否安全?例如,假设我有成员函数CMyClass的类CMyClass::MemberFunc,我想在CMyClass内创建另一个CMyClass::MemberFunc实例。

void CMyClass::MemberFunc( void )
{
    CMyClass * pMyClass = new CMyClass();
}

这合法/安全吗?我知道它编译。我关心的是递归。当我第一次从主应用程序实例化CMyClass时,是否会遇到递归错误?

void main( void )
{
    static CMyClass * s_pMyClass = new CMyClass(); // Will this cause recursion?
}

或者,只有在调用具有附加类实例的特定成员函数时才会发生递归吗?

void CMyClass::MemberFunc( void )
{
    CMyClass * pMyClass = new CMyClass();
    pMyClass->MemberFunc(); // Pretty sure this will cause a recursive loop.
}

换句话说,我可以安全地在该类的成员函数中实例化一个给定的类,只要我不调用该类的第二个实例的成员函数吗?感谢。

4 个答案:

答案 0 :(得分:3)

这比实例化任何其他对象更安全或更不安全。请注意,在底部的示例中,递归严格基于方法调用自身的事实;无论如何,它都会无限期地递归。

总之:你应该没事。

答案 1 :(得分:2)

调用自身的(成员)函数称为递归。

  

这合法/安全吗?

void CMyClass::MemberFunc( void )
{

    CMyClass * pMyClass = new CMyClass();

    delete pMyClass ;  // newly added.

}

部分正确。因为每个new操作都应该具有delete操作,并伴随特定实例将资源返回到免费存储。除了内存泄漏之外,上面的代码段也没问题。

  

或者,只有在调用具有附加类实例的特定成员函数时才会发生递归吗?

void CMyClass::MemberFunc( void )
{
    CMyClass * pMyClass = new CMyClass();
    pMyClass->MemberFunc(); // Pretty sure this will cause a recursive loop.
}

是的,经过一段时间后,由于没有办法为特定实例调用析构函数,因为CMyClass::MemberFunc被递归调用,所以你应该用完内存。(假设delete pMyClass;为结束语句在成员函数中)

此外,当方法没有收到任何参数时,不需要在参数列表中放置void。我认为,它是C风格。

答案 2 :(得分:1)

更正,除非您从创建的第二个实例中显式调用该成员函数,否则不会导致递归。当然,只要你有某种基本情况可以突破,递归并不总是坏事。

答案 3 :(得分:0)

不,它不会导致递归 - 如果确实如此,您的编译器会将其标记为错误。我怀疑你真的想要创建一个类的静态实例(例如一个单例)。你能发一个真实世界的用例来说明你想做什么吗?