Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351

Ключевое слово static (использование для объявления переменной в классе)

05.07.2019, 12:17. Показов 1769. Ответов 27
Метки нет (Все метки)

Всем привет.
Почитал книжки и интернет, но не совсем понял:
Вот пример:
test.h
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
#ifndef TEST_H
#define TEST_H
 
#include <iostream>
#include <memory>
 
class ITest
{
public:
    virtual int testID() = 0;
};
 
class CTest : public ITest
{
public:
    explicit CTest(int id = 0);
    virtual ~CTest();
    static ITest * test;
    virtual int testID();
private:
    int m_testID = 0;
};
 
ITest * getTestInterface(int id);
void stopTest();
 
#endif // TEST_H
test.cpp
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
31
32
33
34
#include "test.h"
 
ITest * CTest::test = nullptr;
 
ITest *getTestInterface(int id)
{
    if(!CTest::test) {
        new CTest(id);
    }
    return CTest::test;
}
 
void stopTest()
{
    if(CTest::test) {
        delete CTest::test;
        CTest::test = nullptr;
    }
}
 
CTest::CTest(int id)
    : m_testID(id)
{
    test = this;
}
 
CTest::~CTest()
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}
 
int CTest::testID() {
    return  m_testID++;
}
main.cpp
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
#include <iostream>
#include <cstring>
#include <fstream>
#include <thread>
#include <unistd.h>
 
#include "test.h"
 
void func(int id)
{
    ITest * ptr = getTestInterface(id);
    int idTest = ptr->testID();
    std::cerr << "ID( " << id << "): " << idTest << std::endl;
}
 
int main()
{
    std::thread func_thread1(func, 10);
    sleep(1);
    std::thread func_thread2(func, 15);
 
    func_thread1.join();
    func_thread2.join();
 
    sleep(3);
    stopTest();
    return 0;
}
Если вот так вызвать всё это, то переменная static ITest * test; будет проинициализирована 1 раз и в каждом вызове функции void func(int id) у нас будет использоваться один и тот же объект? И хоть из 50 потоков будет вызвана функция getTestInterface() все равно будет один и тот же экземпляр?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2019, 12:17
Ответы с готовыми решениями:

Ключевое слово static для переменных в файле
Много где пишут, если в файле объявить переменную с классом памяти static, то такая переменная будет видна только в том файле где она...

Ключевое слово static
Здорова господа!!! Есть две функции f1() и f2(). #include &lt;iostream&gt; using std::cout; using std::endl; int&amp; f1() ...

Зачем использовать ключевое слово static?
Здравствуйте. Зачем использовать ключевое слово static? И в каких ситуациях нужно использовать именно static?

27
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
05.07.2019, 12:56
Цитата Сообщение от qwe123qwea Посмотреть сообщение
а там где используется не получится никак кроме через фабричную функцию создать объект.
Возможно, но это ничего не меняет
Корректнее будет делать присваивание в фабричной функции, т.к. она именно для этого и создана. А конструктор пусть занимается прямыми своими обязанностями: инициализирует объект.
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
05.07.2019, 13:00  [ТС]
DrOffset, для читаемости кода будет однозначно лучше в в фабричной функции это делать. Это я просто ковырялся во всём это и наткнулся на такую возможность.
0
 Аватар для eva2326
1683 / 511 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
05.07.2019, 13:02
Цитата Сообщение от Undisputed Посмотреть сообщение
UB как минимум потому что есть вероятность параллельного доступа на модификацию данных без использования каких либо средств синхронизации
Отсутствие thread-safe не влечет за собой автоматически UB
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
05.07.2019, 13:27
eva2326,
Это если в однопоточной среде, а у ТС среда многопоточная

6.8.2.1 Data races
...
The execution of a program contains a data race
if it contains two potentially concurrent conflicting actions,
at least one of which is not atomic, and neither happens before the other, except for the special case for
signal handlers described below. Any such data race results in undefined behavior
two potentially concurrent conflicting actions тут есть
как минимум поэтому в данном случае есть и UB
0
 Аватар для eva2326
1683 / 511 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
05.07.2019, 14:56
Цитата Сообщение от Undisputed Посмотреть сообщение
Это если в однопоточной среде, а у ТС среда многопоточная
Специально перечитала всю тему.
ТС ничего о многопоточности нигде не писал.

Вы это сами придумали?

Цитата Сообщение от Undisputed Посмотреть сообщение
two potentially concurrent conflicting actions тут есть
"Тут" это "где"?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
05.07.2019, 15:10
Цитата Сообщение от eva2326 Посмотреть сообщение
Вы это сами придумали?
Нет конечно ))
Цитата Сообщение от eva2326 Посмотреть сообщение
Специально перечитала всю тему.
Значит не так уж и внимательно читали...
Посмотрите main в коде который ТС сюда запостил

Цитата Сообщение от Undisputed Посмотреть сообщение
two potentially concurrent conflicting actions тут есть
как минимум поэтому в данном случае есть и UB
вернее есть two potentially concurrent conflicting actions, которые приводят к data race

Добавлено через 3 минуты
Цитата Сообщение от eva2326 Посмотреть сообщение
"Тут" это "где"?
это в коде тс
1
 Аватар для eva2326
1683 / 511 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
05.07.2019, 16:33
Цитата Сообщение от Undisputed Посмотреть сообщение
Посмотрите main в коде который ТС сюда запостил
Цитата Сообщение от qwe123qwea Посмотреть сообщение
std::thread func_thread1(func, 10);
* * sleep(1);
* * std::thread func_thread2(func, 15);
Ну да. Здесь UB)))
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.07.2019, 17:27
qwe123qwea, этот класс CTest - одна сплошная западня для клиентского кода. Конструктор присваивает статическое поле... Методы заставляют память течь (выделение памяти в куче без сохранение адреса в переменную).
Особенно понравилось:
C++
1
2
3
4
5
6
7
void stopTest()
{
    if(CTest::test) {
        delete CTest::test;
        CTest::test = nullptr;
    }
}
Публичный статический указатель содержащий адрес какого-то объекта (последнего из созданных), может быть молодецки прибит из любого места клиентского кода, а крэш наступит при выходе из области последнего созданного объекта и данный метод это демонстрирует.
Душераздирающее зрелище.
зы
Сейчас нет возможности проверить, но думаю, что при копировании при воозврате по значению объекта созданного локально к функции должно быть классно вообще.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2019, 17:27

Ключевое слово static в объявлении функции
Доброго времени суток. У меня возник вопрос по поводу использования слово static в объявлении функции. На сколько мне известно данное...

Зачем и когда нужно писать ключевое слово static
Не как не могу понять зачем и когда нужно писать ключевое слово static. Может вы мне подскажите ?

Ключевое слово const после декларации функции в классе
Здравствуйте, у меня есть подобный класс-шаблон: template &lt;typename Type&gt; class Array { private: Type* ptr; // ...

Объявление static переменной в классе
class Worker { private : struct WorkerItem { UnicodeString fio; UnicodeString depart; UnicodeString exp; ...

Классы.Ключевое слово static - выдает ошибку "неразрешенный внешний символ"
Всем доброго времени суток. Изучаю С++ по Шпаку и по урокам на сайте cppstudio.com, предварительно хорошо ознакомившись с ассемблером... ...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru