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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 245
Завершенные тесты: 3
#1

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

24.09.2016, 16:13. Просмотров 337. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как реализовать функцию-член, которую можно вызвать только один единственный раз? (C++):

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

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

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

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

Можно ли один раз создать функцию в потоке, а потом просто вызывать ее - C++
Не ругайтесь, я искал, не нашел ответа на такой вопрос. Я вот использую потоки следующим образом: void поток(){ while(true){ ...

Как определить переменную только один раз? - C++
Как в функции определить перменную только один раз? Ну чтобы потом при последующих вызовах она не переопределялась, забыл блин, там слово...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rikimaru2013
C++ Game Dev
2435 / 1129 / 240
Регистрация: 30.11.2013
Сообщений: 3,686
24.09.2016, 16:49 #2
Ваш код не компилируется. Напишите main и все дела, что людям было легче вникнуть в проблему и помочь вам. Define это для компиляции кода - как только ваш код скомпилирован - нет гарантии, что DoSmth не вызовут 100500 раз. Вызов в конструкторе класса родителя методов - будут вызываться в классах наследников.
1
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 245
Завершенные тесты: 3
24.09.2016, 16:52  [ТС] #3
rikimaru2013, А как мне поступить, чтобы DoSmth() вызывалось один раз?
0
GbaLog-
Любитель чаепитий
2769 / 1291 / 311
Регистрация: 24.08.2014
Сообщений: 4,576
Записей в блоге: 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
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 245
Завершенные тесты: 3
24.09.2016, 17:06  [ТС] #5
Я так не люблю подобные костыли. Нету другого способа?
0
DrOffset
7141 / 4282 / 964
Регистрация: 30.01.2014
Сообщений: 7,084
24.09.2016, 17:19 #6
Цитата Сообщение от maks242 Посмотреть сообщение
Нету другого способа?
Давай еще раз уточним задачу.
Тебе нужно, чтобы функция выполнялась один раз за все время выполнения программы?
Проиллюстрируй кодом то, что ты сейчас наблюдаешь у себя. Возможных вариантов тут пока два:
* либо ты архитектурно неправильно строишь приложение, поэтому средства языка "сопротивляются", вынуждая прибегать к "костыльным" решениям,
* либо ты где-то не разобрался в синтаксисе и нужно просто подсказать как правильно.
но пока не будет сколько-нибудь полного кода, иллюстрирующего проблему, верно подсказать тебе будет невозможно.
1
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 245
Завершенные тесты: 3
24.09.2016, 17:33  [ТС] #7
DrOffset, Вообще, мне нужно чтобы в начале выполнения программы вызвалось две функции. Но так как за эти функции отвечает один класс, мне приходиться создавать экземпляр этого класса и в конструкторе этого класса я делаю вызов этих функций. Но это родительский класс, а есть еще наследники, которые так же вызывают эти функции. Можно было сделать эти функции статическими, но тогда придётся их делать публичными и они будут отображаться при работе с дочерними классами, а мне этого не нужно.
0
DrOffset
7141 / 4282 / 964
Регистрация: 30.01.2014
Сообщений: 7,084
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, и больше ни разу.
5
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 245
Завершенные тесты: 3
24.09.2016, 17:46  [ТС] #9
DrOffset, Выглядит неплохо. Думаю да, спасибо.
0
Avazart
24.09.2016, 17:54
  #10

Не по теме:

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

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

0
rikimaru2013
C++ Game Dev
2435 / 1129 / 240
Регистрация: 30.11.2013
Сообщений: 3,686
24.09.2016, 19:09 #11
DrOffset, почему вы пошли сложным путём? Почему не обычный метод init ? А если нужна гарантия, что пользователь только 1 раз вызовет - то friend синглтон инициализатор.
0
DrOffset
7141 / 4282 / 964
Регистрация: 30.01.2014
Сообщений: 7,084
24.09.2016, 19:17 #12
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
почему вы пошли сложным путём? Почему не обычный метод init ?
ТС дал понять, что не хочет вносить статические методы в публичный интерфейс класса.
Я в своем предложении исходил из анализа предоставленных им отрывочных сведений.
1
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 245
Завершенные тесты: 3
24.09.2016, 19:45  [ТС] #13
Avazart, уважаемый, насчёт костылей я говорил о том способе, который мне предложил GbaLog-. Тем не менее, я вижу, что человек пытался мне помочь, а в вашем сообщении, кроме бессмысленной чепухи, ничего не увидел.
P.S. Я совершенно не понимаю за что мне дали предупреждение, ибо меня в первую очередь интересовало почему происходит так, а не иначе, а только потом хотел узнать как сделать мне правильно. Очень приятное сообщество на этом форуме.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
24.09.2016, 20:14 #14
Цитата Сообщение от maks242 Посмотреть сообщение
Я совершенно не понимаю за что мне дали предупреждени
За то, что правил не читаете. Хотя Вас перед этим дважды предупредили в ЛС. А сейчас прилюдно обсуждаете действия администрации, что тоже нарушение. То есть, правила так и не прочитали. То есть, проигнорировали действия администрации. Опять нарушение. Мне продолжить?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2016, 20:14
Привет! Вот еще темы с ответами:

Как в цикле можно выполнить действие один раз? - C++
Есть цикл, который выполняется n раз. Но 1 действие в этом цикле необходимо выполнить только 1 раз. Как можно это сделать? ...

Как сделать что бы повторяющиеся элементы выводило и считало только один раз? - C++
#include &lt;stdio.h&gt;; #include &lt;math.h&gt;; int m,i,j,s,n; void main() { int arr; printf(&quot;\nУкажите размер массива - &quot;); ...

Выбрать из текста только те символы, которые встречаются в нем только один раз - C++
Здравствуйте, помогите пожалуйста написать программу:) Условие. Дана строка, содержащая текст на русском языке. Выбрать из него только те...

Напечатать только те буквы слов, котрые встречаются в обоих словах только один раз - C++
Помогите решить в Borland c++ Если можно еще блок-схему Заданы два слова. Напечатать только те буквы слов, котрые встречаются в...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.09.2016, 20:14
Ответ Создать тему
Опции темы

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