Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255

Как реализовать функцию-член, которую можно вызвать только один единственный раз?

24.09.2016, 16:13. Показов 5198. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Моя проблема в том, что при создании экземпляра дочернего класса, выполняется функция DoSmth() хотя, уже есть экземпляр родительского класса, который выполнил эту функцию. Подскажите почему так происходит и как мне быть, чтобы функция DoSmth выполнялась всего один раз. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Class
{
public:
    Class();
 
    void DoSmth();
};
 
Class::Class()
{
#ifndef _CLASS_INIT_
#define _CLASS_INIT_
    DoSmth();
#endif
}
void Class::DoSmth()
{
    std::cout << "Smth";
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2016, 16:13
Ответы с готовыми решениями:

Определить функцию-член в наследнике так, чтобы её можно было вызвать только по ссылке на базовый класс
Пусть дан абстрактный класс A class A { public: void virtual method() const = 0; }; Определите класс B - наследник от...

Как правильно вызвать функцию, в которую передаётся указатель на структуру?
#define _CRT_SECURE_NO_WARNINGS #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; struct settings { int number; ...

Как вызвать функцию-член правильно для класса Person
Задача простая, ввести фамилию и имя и вывести их. Подскажите, как правильно написать функцию вывода print(). Если один параметр...

13
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
24.09.2016, 16:49
Ваш код не компилируется. Напишите main и все дела, что людям было легче вникнуть в проблему и помочь вам. Define это для компиляции кода - как только ваш код скомпилирован - нет гарантии, что DoSmth не вызовут 100500 раз. Вызов в конструкторе класса родителя методов - будут вызываться в классах наследников.
1
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
24.09.2016, 16:52  [ТС]
rikimaru2013, А как мне поступить, чтобы DoSmth() вызывалось один раз?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
24.09.2016, 17:02
maks242, Сделать переменную типа bool, которая в самом методе будет проверяться, с самого начала она false, а при входе в метод можно вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Class::DoSmth()
{
    if( !is_running )
    {
        is_running = true;
    }
    else
    {
        return;
    }
...
}
1
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
24.09.2016, 17:06  [ТС]
Я так не люблю подобные костыли. Нету другого способа?
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
24.09.2016, 17:19
Цитата Сообщение от maks242 Посмотреть сообщение
Нету другого способа?
Давай еще раз уточним задачу.
Тебе нужно, чтобы функция выполнялась один раз за все время выполнения программы?
Проиллюстрируй кодом то, что ты сейчас наблюдаешь у себя. Возможных вариантов тут пока два:
* либо ты архитектурно неправильно строишь приложение, поэтому средства языка "сопротивляются", вынуждая прибегать к "костыльным" решениям,
* либо ты где-то не разобрался в синтаксисе и нужно просто подсказать как правильно.
но пока не будет сколько-нибудь полного кода, иллюстрирующего проблему, верно подсказать тебе будет невозможно.
1
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
24.09.2016, 17:33  [ТС]
DrOffset, Вообще, мне нужно чтобы в начале выполнения программы вызвалось две функции. Но так как за эти функции отвечает один класс, мне приходиться создавать экземпляр этого класса и в конструкторе этого класса я делаю вызов этих функций. Но это родительский класс, а есть еще наследники, которые так же вызывают эти функции. Можно было сделать эти функции статическими, но тогда придётся их делать публичными и они будут отображаться при работе с дочерними классами, а мне этого не нужно.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
24.09.2016, 17:45
Лучший ответ Сообщение было отмечено maks242 как решение

Решение

maks242,
такое решение тебя устроит?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Base
{
public:
    
private:
    static void doSomething()
    {
        std::cout << "doSomething\n";
    }
    static void doAnother()
    {
        std::cout << "doAnother\n";
    }
    
    static struct StaticInitializer
    {
        StaticInitializer()
        {
            doSomething();
            doAnother();
        }
    } init;
};
 
// Это внутри какого-то cpp:
Base::StaticInitializer Base::init;
Онлайн демо: http://rextester.com/PRBYB53466


Добавлено через 6 минут
Или такое:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Base
{
public:
    Base()
    {
        static StaticInitializer init;
    }
        
private:
    static void doSomething()
    {
        std::cout << "doSomething\n";
    }
    static void doAnother()
    {
        std::cout << "doAnother\n";
    }
    struct StaticInitializer
    {
        StaticInitializer()
        {
            doSomething();
            doAnother();
        }
    };
};
 
class Derived : public Base
{
};
http://rextester.com/NURKX92736

В этом случае две функции вызовутся при самом первом вызове конструктора Base, и больше ни разу.
5
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
24.09.2016, 17:46  [ТС]
DrOffset, Выглядит неплохо. Думаю да, спасибо.
0
24.09.2016, 17:54

Не по теме:

Забавно человек не понимает что такое макросы, но тем не менее выдает такие перлы:

Цитата Сообщение от maks242 Посмотреть сообщение
Я так не люблю подобные костыли

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
24.09.2016, 19:09
DrOffset, почему вы пошли сложным путём? Почему не обычный метод init ? А если нужна гарантия, что пользователь только 1 раз вызовет - то friend синглтон инициализатор.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
24.09.2016, 19:17
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
почему вы пошли сложным путём? Почему не обычный метод init ?
ТС дал понять, что не хочет вносить статические методы в публичный интерфейс класса.
Я в своем предложении исходил из анализа предоставленных им отрывочных сведений.
1
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
24.09.2016, 19:45  [ТС]
Avazart, уважаемый, насчёт костылей я говорил о том способе, который мне предложил GbaLog-. Тем не менее, я вижу, что человек пытался мне помочь, а в вашем сообщении, кроме бессмысленной чепухи, ничего не увидел.
P.S. Я совершенно не понимаю за что мне дали предупреждение, ибо меня в первую очередь интересовало почему происходит так, а не иначе, а только потом хотел узнать как сделать мне правильно. Очень приятное сообщество на этом форуме.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
24.09.2016, 20:14
Цитата Сообщение от maks242 Посмотреть сообщение
Я совершенно не понимаю за что мне дали предупреждени
За то, что правил не читаете. Хотя Вас перед этим дважды предупредили в ЛС. А сейчас прилюдно обсуждаете действия администрации, что тоже нарушение. То есть, правила так и не прочитали. То есть, проигнорировали действия администрации. Опять нарушение. Мне продолжить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2016, 20:14
Помогаю со студенческими работами здесь

Как создать указатель на функцию-член класса и вызвать его?
Подскажите как правильно сделать, а в дальнейшем вызвать указатель на функцию член класса: #include &quot;stdafx.h&quot; #include...

Показать div только один раз и больше не отображать его после его закрытия. Как реализовать?
&lt;div&gt; &lt;p align=&quot;center&quot;&gt; &lt;a&gt;&amp;times;&lt;/a&gt; &lt;/p&gt; Если вы закроете этот блок, то больше никогда его не увидите! &lt;div&gt;Спасибо за...

Bitmap.BeginInit можно использовать только один раз?
Народ смотрите проблему, я хочу вывести список картинок ссылки на которые у меня находятся в массиве string, у меня выбивает ошибку что я...

Заданный элемент встречается в некотором списке один единственный раз (является уникальным)
Напишите правило, которое проверяет, если заданный элемент встречается в некотором списке один единственный раз (является уникальным)

Можно ли в ENTER_FRAME запустить функцию один раз?
Например, мне нужно, чтобы при столкновении объектов (круга и квадрата), квадрат начинал крутиться. Я просчитываю кадры до столкновения, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru