Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 233
Завершенные тесты: 2
24.09.2016, 16:13     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #1
Доброго времени суток. Моя проблема в том, что при создании экземпляра дочернего класса, выполняется функция 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";
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2016, 16:13     Как реализовать функцию-член, которую можно вызвать только один единственный раз?
Посмотрите здесь:

C++ Сформировать строку, в которую попадут только те слова, где одинаковые буквы встречаются более двух раз
Как сделать что бы повторяющиеся элементы выводило и считало только один раз? C++
C++ Как определить переменную только один раз?
C++ Определить, можно ли заполнить бочку используя ведра только один раз
Как создать указатель на функцию-член класса и вызвать его? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2134 / 967 / 223
Регистрация: 30.11.2013
Сообщений: 3,236
24.09.2016, 16:49     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #2
Ваш код не компилируется. Напишите main и все дела, что людям было легче вникнуть в проблему и помочь вам. Define это для компиляции кода - как только ваш код скомпилирован - нет гарантии, что DoSmth не вызовут 100500 раз. Вызов в конструкторе класса родителя методов - будут вызываться в классах наследников.
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 233
Завершенные тесты: 2
24.09.2016, 16:52  [ТС]     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #3
rikimaru2013, А как мне поступить, чтобы DoSmth() вызывалось один раз?
GbaLog-
Не Эксперт C++
1473 / 618 / 174
Регистрация: 24.08.2014
Сообщений: 2,521
Записей в блоге: 1
Завершенные тесты: 2
24.09.2016, 17:02     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #4
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;
    }
...
}
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 233
Завершенные тесты: 2
24.09.2016, 17:06  [ТС]     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #5
Я так не люблю подобные костыли. Нету другого способа?
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
24.09.2016, 17:19     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #6
Цитата Сообщение от maks242 Посмотреть сообщение
Нету другого способа?
Давай еще раз уточним задачу.
Тебе нужно, чтобы функция выполнялась один раз за все время выполнения программы?
Проиллюстрируй кодом то, что ты сейчас наблюдаешь у себя. Возможных вариантов тут пока два:
* либо ты архитектурно неправильно строишь приложение, поэтому средства языка "сопротивляются", вынуждая прибегать к "костыльным" решениям,
* либо ты где-то не разобрался в синтаксисе и нужно просто подсказать как правильно.
но пока не будет сколько-нибудь полного кода, иллюстрирующего проблему, верно подсказать тебе будет невозможно.
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 233
Завершенные тесты: 2
24.09.2016, 17:33  [ТС]     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #7
DrOffset, Вообще, мне нужно чтобы в начале выполнения программы вызвалось две функции. Но так как за эти функции отвечает один класс, мне приходиться создавать экземпляр этого класса и в конструкторе этого класса я делаю вызов этих функций. Но это родительский класс, а есть еще наследники, которые так же вызывают эти функции. Можно было сделать эти функции статическими, но тогда придётся их делать публичными и они будут отображаться при работе с дочерними классами, а мне этого не нужно.
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
24.09.2016, 17:45     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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, и больше ни разу.
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 233
Завершенные тесты: 2
24.09.2016, 17:46  [ТС]     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #9
DrOffset, Выглядит неплохо. Думаю да, спасибо.
Avazart
24.09.2016, 17:54
  #10

Не по теме:

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

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

rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2134 / 967 / 223
Регистрация: 30.11.2013
Сообщений: 3,236
24.09.2016, 19:09     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #11
DrOffset, почему вы пошли сложным путём? Почему не обычный метод init ? А если нужна гарантия, что пользователь только 1 раз вызовет - то friend синглтон инициализатор.
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
24.09.2016, 19:17     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #12
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
почему вы пошли сложным путём? Почему не обычный метод init ?
ТС дал понять, что не хочет вносить статические методы в публичный интерфейс класса.
Я в своем предложении исходил из анализа предоставленных им отрывочных сведений.
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 233
Завершенные тесты: 2
24.09.2016, 19:45  [ТС]     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #13
Avazart, уважаемый, насчёт костылей я говорил о том способе, который мне предложил GbaLog-. Тем не менее, я вижу, что человек пытался мне помочь, а в вашем сообщении, кроме бессмысленной чепухи, ничего не увидел.
P.S. Я совершенно не понимаю за что мне дали предупреждение, ибо меня в первую очередь интересовало почему происходит так, а не иначе, а только потом хотел узнать как сделать мне правильно. Очень приятное сообщество на этом форуме.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2016, 20:14     Как реализовать функцию-член, которую можно вызвать только один единственный раз?
Еще ссылки по теме:

Как в цикле можно выполнить действие один раз? C++
C++ Сформировать строку, в которую попадут только те слова, где одинаковые буквы встречаются более 2 раз
C++ Как вызвать член класса по адресу?

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
 Аватар для gru74ik
3116 / 1342 / 167
Регистрация: 20.02.2013
Сообщений: 3,809
Записей в блоге: 17
24.09.2016, 20:14     Как реализовать функцию-член, которую можно вызвать только один единственный раз? #14
Цитата Сообщение от maks242 Посмотреть сообщение
Я совершенно не понимаю за что мне дали предупреждени
За то, что правил не читаете. Хотя Вас перед этим дважды предупредили в ЛС. А сейчас прилюдно обсуждаете действия администрации, что тоже нарушение. То есть, правила так и не прочитали. То есть, проигнорировали действия администрации. Опять нарушение. Мне продолжить?
Yandex
Объявления
24.09.2016, 20:14     Как реализовать функцию-член, которую можно вызвать только один единственный раз?
Ответ Создать тему
Опции темы

Текущее время: 11:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru