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

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

05.07.2019, 12:17. Показов 1652. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
05.07.2019, 12:56
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от qwe123qwea Посмотреть сообщение
а там где используется не получится никак кроме через фабричную функцию создать объект.
Возможно, но это ничего не меняет
Корректнее будет делать присваивание в фабричной функции, т.к. она именно для этого и создана. А конструктор пусть занимается прямыми своими обязанностями: инициализирует объект.
0
75 / 59 / 31
Регистрация: 20.03.2017
Сообщений: 351
05.07.2019, 13:00  [ТС]
DrOffset, для читаемости кода будет однозначно лучше в в фабричной функции это делать. Это я просто ковырялся во всём это и наткнулся на такую возможность.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
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
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
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
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru