Реализация класса внутри функции-члена - PullRequest
5 голосов
/ 12 мая 2011

Безопасно ли создавать экземпляр класса внутри функции-члена этого класса?Например, допустим, у меня есть класс 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 ]

3 голосов
/ 12 мая 2011

Это не более или менее безопасно, чем создание любого другого объекта. Обратите внимание, что в вашем примере внизу рекурсия строго основана на том факте, что метод вызывает сам себя; он будет бесконечно повторяться независимо.

В сумме: с тобой все будет в порядке.

2 голосов
/ 12 мая 2011

Функция (член), вызывающая себя, называется рекурсией.

Это законно / безопасно?

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.

1 голос
/ 12 мая 2011

Правильно, если вы явно не вызовете эту функцию-член из второго созданного экземпляра, вы не вызовете рекурсию.Конечно, рекурсия не всегда плохая вещь, если у вас есть какое-то базовое условие, которое нужно выполнить.

0 голосов
/ 12 мая 2011

Нет, это не вызовет рекурсию - ваш компилятор пометит это как ошибку, если это произойдет.Я подозреваю, что вы действительно хотите создать статический экземпляр вашего класса (например, синглтон).Можете ли вы опубликовать реальный пример использования, иллюстрирующий, что вы хотите сделать?

...