Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
maks242
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
Завершенные тесты: 6
1

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

24.09.2016, 16:13. Просмотров 1123. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2016, 16:13
Ответы с готовыми решениями:

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

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

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

Определить, можно ли заполнить бочку используя ведра только один раз
Дана бочка, ёмкостью b и N штук разного объёма V вёдер. МОжно ли заполнить...

Создать функцию, определяющую номера элементов, которые встречаются в массиве только один раз
Создать функцию, определяющую номера элементов, которые встречаются в массиве...

13
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
24.09.2016, 16:49 2
Ваш код не компилируется. Напишите main и все дела, что людям было легче вникнуть в проблему и помочь вам. Define это для компиляции кода - как только ваш код скомпилирован - нет гарантии, что DoSmth не вызовут 100500 раз. Вызов в конструкторе класса родителя методов - будут вызываться в классах наследников.
1
maks242
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
Завершенные тесты: 6
24.09.2016, 16:52  [ТС] 3
rikimaru2013, А как мне поступить, чтобы DoSmth() вызывалось один раз?
0
GbaLog-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,207
Записей в блоге: 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;
    }
...
}
1
maks242
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
Завершенные тесты: 6
24.09.2016, 17:06  [ТС] 5
Я так не люблю подобные костыли. Нету другого способа?
0
DrOffset
8919 / 4800 / 1176
Регистрация: 30.01.2014
Сообщений: 7,834
24.09.2016, 17:19 6
Цитата Сообщение от maks242 Посмотреть сообщение
Нету другого способа?
Давай еще раз уточним задачу.
Тебе нужно, чтобы функция выполнялась один раз за все время выполнения программы?
Проиллюстрируй кодом то, что ты сейчас наблюдаешь у себя. Возможных вариантов тут пока два:
* либо ты архитектурно неправильно строишь приложение, поэтому средства языка "сопротивляются", вынуждая прибегать к "костыльным" решениям,
* либо ты где-то не разобрался в синтаксисе и нужно просто подсказать как правильно.
но пока не будет сколько-нибудь полного кода, иллюстрирующего проблему, верно подсказать тебе будет невозможно.
1
maks242
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
Завершенные тесты: 6
24.09.2016, 17:33  [ТС] 7
DrOffset, Вообще, мне нужно чтобы в начале выполнения программы вызвалось две функции. Но так как за эти функции отвечает один класс, мне приходиться создавать экземпляр этого класса и в конструкторе этого класса я делаю вызов этих функций. Но это родительский класс, а есть еще наследники, которые так же вызывают эти функции. Можно было сделать эти функции статическими, но тогда придётся их делать публичными и они будут отображаться при работе с дочерними классами, а мне этого не нужно.
0
DrOffset
8919 / 4800 / 1176
Регистрация: 30.01.2014
Сообщений: 7,834
24.09.2016, 17:45 8
Лучший ответ Сообщение было отмечено 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
maks242
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
Завершенные тесты: 6
24.09.2016, 17:46  [ТС] 9
DrOffset, Выглядит неплохо. Думаю да, спасибо.
0
Avazart
24.09.2016, 17:54
  #10

Не по теме:

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

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

0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
24.09.2016, 19:09 11
DrOffset, почему вы пошли сложным путём? Почему не обычный метод init ? А если нужна гарантия, что пользователь только 1 раз вызовет - то friend синглтон инициализатор.
0
DrOffset
8919 / 4800 / 1176
Регистрация: 30.01.2014
Сообщений: 7,834
24.09.2016, 19:17 12
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
почему вы пошли сложным путём? Почему не обычный метод init ?
ТС дал понять, что не хочет вносить статические методы в публичный интерфейс класса.
Я в своем предложении исходил из анализа предоставленных им отрывочных сведений.
1
maks242
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
Завершенные тесты: 6
24.09.2016, 19:45  [ТС] 13
Avazart, уважаемый, насчёт костылей я говорил о том способе, который мне предложил GbaLog-. Тем не менее, я вижу, что человек пытался мне помочь, а в вашем сообщении, кроме бессмысленной чепухи, ничего не увидел.
P.S. Я совершенно не понимаю за что мне дали предупреждение, ибо меня в первую очередь интересовало почему происходит так, а не иначе, а только потом хотел узнать как сделать мне правильно. Очень приятное сообщество на этом форуме.
0
sourcerer
Модератор
Эксперт CЭксперт С++
4868 / 2053 / 325
Регистрация: 20.02.2013
Сообщений: 5,555
Записей в блоге: 24
Завершенные тесты: 1
24.09.2016, 20:14 14
Цитата Сообщение от maks242 Посмотреть сообщение
Я совершенно не понимаю за что мне дали предупреждени
За то, что правил не читаете. Хотя Вас перед этим дважды предупредили в ЛС. А сейчас прилюдно обсуждаете действия администрации, что тоже нарушение. То есть, правила так и не прочитали. То есть, проигнорировали действия администрации. Опять нарушение. Мне продолжить?
0
24.09.2016, 20:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2016, 20:14

Можно ли один раз создать функцию в потоке, а потом просто вызывать ее
Не ругайтесь, я искал, не нашел ответа на такой вопрос. Я вот использую потоки...

Как определить переменную только один раз?
Как в функции определить перменную только один раз? Ну чтобы потом при...

Как вывести строки только один раз в начале?
Нужно эти строки вывести только в начале, что бы после нажатия продолжения...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru