У меня есть статический экземпляр (ранее называвшийся синглтоном, но комментаторы недовольны этим) класса, который является производным от базового класса. Все идет нормально.
Derived
имеет статическую функцию fun
, а Base
имеет функцию-член fun
(не спрашивайте). Очевидно, что вызов instance->fun()
в Derived::fun()
создаёт бесконечную рекурсию, заканчивающуюся переполнением стека.
Мне удалось избежать этого, позвонив вместо этого ((Base*)instance)->fun()
:
struct Base {
void fun() { /* ... */ }
};
struct Derived;
static Derived * instance = nullptr;
struct Derived : Base {
static void fun() {
// stack overflow!
// instance->fun();
// works!
((Base*)instance)->fun();
}
};
int main() {
instance = new Derived();
Derived::fun();
}
Есть ли лучший способ избежать вызова статической функции, определенной в Derived
?
static
здесь ни на что не влияет; та же проблема может возникнуть с нестатической функцией-членом. Проблема в поиске имени.
почему ты думаешь, что тебе нужно что-то лучше?
«У меня есть синглтон» Тебя здесь нет. Выбор создания одного объекта не делает его одноэлементным.
@DrewDormann - это, очевидно, квинтэссенция проблемы, а не дословное воспроизведение. Вот как это должно быть.
@PeteBecker, разве очевидная квинтэссенция этой проблемы не будет иметь синглтонов? Это не вопрос об одиночках. Я вижу непонимание терминологии, но, возможно, я ошибаюсь.
@DrewDormann - очевидно, что в исходном коде использовался синглтон, и при перегонке было удалено все, что делает его синглтоном, кроме имени указателя. Одна из худших особенностей Stackoverflow — люди, которые настаивают на своей версии точности, несмотря на то, что вопрос совершенно ясен. Просто притворитесь, что здесь нет упоминания о «синглтоне», и вы, вероятно, лучше поймете вопрос.
@463035818_is_not_an_ai интуитивное чувство. На самом деле, я всегда задаюсь вопросом, есть ли что-то лучше, даже если у меня нет для этого конкретной причины. И, глядя на ответ Юджина, я чувствую, что моя интуиция была верной.
«Просто притворитесь, что здесь нет упоминания о «синглтоне», и вы, вероятно, лучше поймете вопрос». - @PeteBecker попал в точку. Я удалил из вопроса термин «синглтон», назвав вместо него переменную instance
.
Если вы спрашиваете, как вызвать метод базового класса с той же сигнатурой, что и метод производного класса, вот ответ: stackoverflow.com/a/357380/19871088
Вы можете вызвать функцию instance->Base::fun()
.
Будущие читатели, обратите внимание: возможно, это результат того, что код представляет собой минимальный воспроизводимый пример - черт возьми, его переделали, чтобы упростить вопрос, но представленный код не реализует синглтон. Современный синглтон будет выглядеть примерно так.