Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452

Static обьект, в каких случаях применяется?

27.05.2015, 17:16. Показов 2688. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня !

Скажите пожалуйста в каком случае применяются статические обьекты.?


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
class A
 
{
    int x;
 
    static A c;
 
public:
 
    A(int h) : x(h) {}
 
    A() : x(0) {}
 
    ~A() {}
 
    static A & GF() 
 
    {
        return c;
    }
 
    int hjhj() const {return x;}
};
 
 A A :: c ;
как я понял эти обьекты создаются сразу при обьявлении класса .

но что-то мне подсказивает , что это не так.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2015, 17:16
Ответы с готовыми решениями:

В каких случаях нужно создавать динамические переменные, а в каких статические?
такой же вопрос и по массивам ! Объясните пожалуйста !

Объясните в каких случаях используеться char, а в каких string?
Зачем(в каких случаях) использовать char, и char *... Зачем(в каких случаях) использовать string...

<iostream> в каких случаях используется?
Что такое &lt;iostream&gt; расскажите о нем, для чего он используется.

35
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.05.2015, 18:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
класс-поле
Цитата Сообщение от Tulosba Посмотреть сообщение
в экземпляре класса

Не по теме:

М-да, Страуструпа на вас нет! И где вы только словей-то таких нахватались? Это из Делфи что ли переползло?



Добавлено через 11 минут
Ну, если проще сказать, то статические данные - это принадлежность типа, а не объекта этого типа.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 18:47
Цитата Сообщение от Mr.X Посмотреть сообщение
И где вы только словей-то таких нахватались?
Словей в Стандартях Я, конечно, не скажу, что там на каждой странице "экземпляр класса" ("instance of a class"), но присутствует местами.
0
Evg
27.05.2015, 21:51

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
В качестве общих (статических) данных я бы лучше привел
Ну а кто мешал привести? Человек задал конкретный вопрос, вместо ответа на вопрос он получил кучу флуда на тему высоких материй, про которые ему (тс'у) вряд ли интересно читать

0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
28.05.2015, 12:26  [ТС]
всем спасибо за ответы !

не думал , что тема так разрастется.

Evg , а что если в качестве поля выступает статический обьект ?

по идеи обьектом может быть зарплата ?

________________________________________ ______

к примеру есть такой код

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
class A
 
{
    int x;
 
    static A c;
 
public:
 
    A(int h) : x(h) {printf("\n *** KONST 2 %p\n",this);}
 
    A() : x(0) {printf("\n *** KONST %p\n",this);}
 
    ~A() {printf("\n *** DEST %p\n",this);}
 
    static A & GF() 
 
    {
        printf("\n *** static int () \n");
 
        return c;
    }
 
    int hjhj() const {return x;}
};
 
 A A :: c ;

используя

C++
1
2
3
4
5
6
7
static A & GF() 
 
    {
        printf("\n *** static int () \n");
 
        return c;
    }
я могу получить ссылку на static A c; где попало.

толи в main()

C++
1
2
3
4
5
6
7
8
9
int main()
 
{
    A  &c = A::GF();
 
       getch();
 
    return 0;
}
толи в какой-то функции void hhjg()

C++
1
2
3
4
5
6
7
8
9
10
11
void hhjg()
 
{
    A  &c = A::GF();
        
    printf("\n  ********* %p\n",&c);
 
     printf("\n  ********** %d\n",c.hjhj());
 
 
}
при этом обьектов мне ненадо для доступа к стат. функции static A & GF()
это вообще адекватное применение ?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.05.2015, 12:48
в этом и смысл статик методов:

- использование методов класса без создания экземпляра класса.
C++
1
2
3
4
5
6
7
#include "Class_algorithms.h"
 
void foo(int num1, int num2)
{
   int suma = Class_algorithms::suma(num1, num2);
}
// если в классе Class_algorithms метод suma статический, подключаем Class_algorithms.h, и юзаем

- можно юзать с любого нестатического метода это поле
C++
1
2
3
4
5
6
7
8
9
void A::setZarplata(int num)
{
    mZarplata = num;
 
    if(num > A::getMaxZarplata())
    {
        A::setMaxZarplata(num);
    }
}
P.S. часто такое поле используют как счётчик созданых экземпляров класса - в конструкторе +1 в деструктоер -1


- в статических методах нету указателя this, который передаётся вовсе не статические методы и указывает на объект от которого вызывается данный метод. По этому в статике нельзя обратится к полю класса, если не передать данный указатель явно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
static void foo(Foo* bar)
{
    bar->a = 10;
        a = 10; // ошибка потому что в реале это расскладывается как this->a = 10;
 
}
 
int main()
{
    Foo a;
    Foo::foo(&a);
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
28.05.2015, 12:49
Цитата Сообщение от RAFA91 Посмотреть сообщение
при этом обьектов мне ненадо для доступа к стат. функции static A & GF()
это вообще адекватное применение ?
Статические функции тоже принадлежат типу, а не объекту. Они для того и существуют, чтобы для типа вызываться.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.05.2015, 13:21
Цитата Сообщение от RAFA91 Посмотреть сообщение
Evg , а что если в качестве поля выступает статический обьект ?
Почитай, что такое static-поле Массивы в заголовочных файлах
Хоть по синтаксису такое поле и описано внутри класса, но технически и логически это просто описание глобальной переменной и не более того

Цитата Сообщение от RAFA91 Посмотреть сообщение
это вообще адекватное применение ?
Идеологически - скорее всего нет. Т.е. я не могу придумать вменяемого примера, где статик полем класса является экземпляр данного класса
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.05.2015, 13:31
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. я не могу придумать вменяемого примера, где статик полем класса является экземпляр данного класса
Например, главный объект какой-либо иерархии.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.05.2015, 13:33
Цитата Сообщение от Tulosba Посмотреть сообщение
Например, главный объект какой-либо иерархии
А какой идеологический смысл засовывать его вовнутрь класса?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.05.2015, 13:58
Цитата Сообщение от Evg Посмотреть сообщение
А какой идеологический смысл засовывать его вовнутрь класса?
А куда его ещё засовывать? Делать явно глобальный объект? Добавлять ссылочное поле в каждый экземпляр?
Статическим членом ему самое место, имхо. Хотя ещё лучше явно реализовать его синглтоном.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.05.2015, 14:21
Цитата Сообщение от Tulosba Посмотреть сообщение
Делать явно глобальный объект?
Разумеется

Цитата Сообщение от Tulosba Посмотреть сообщение
Статическим членом ему самое место, имхо
Тогда приведи пример того, что такое "главный объект иерархии" и чтобы он логично сидел внутри класса
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
28.05.2015, 16:05  [ТС]
при создании односвязаного списка я такое видел.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
28.05.2015, 16:35
И что конкретно внутри списка потребовало наличия самого себя в виде static поля?
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
29.05.2015, 12:46  [ТС]
смотрите class PartsList строка 132


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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
// **********************************
//
// Название: Подведение итогов
//
// Файл: Week2
//
// Описание: Демонстрация создания и использования связанного списка
//
// Классы: PART - содержит идентификационный
 // номер детали и обеспечивает возможность
 // добавлять другие данные
 // PartNode - функционирует как узел в PartsList
 //
 // PartsList - реализует механизм связывания
 // узлов в список
 //
 // **********************************
 
 #include <iostream.h>
 
 
 
 // **************** Part ************
 
 // Абстрактный базовый класс, общий для всех деталей
 class Part
 {
    public:
       Part():itsPartNumber(1) { }
       Part(int PartNumber):itsPartNumber(PartNumber) { }
       virtual ~Part() { };
       int GetPartNumber() const { return itsPartNumber; }
       virtual void Display() const =0; // должна быть замещена как private
    private:
       int itsPartNumber;
 };
 
 // выполнение чистой виртуальной функции в
 // стандартном виде для всех производных классов
 void Part::Display() const
 {
    cout << "\nНомер детали: " << itsPartNumber << endl;
 }
 
 // ************* Автомобильные детали **********
 
 class CarPart : public Part
 {
    public:
       CarPart():itsModelYear(94){ }
       CarPart(int year, int partNumber);
       virtual void Display() const
       {
          Part::Display(); cout << "Год создания: ";
          cout << itsModelYear << endl;
       }
    private:
       int itsModelYear;
 };
 
 CarPart::CarPart(int year, int partNumber):
    itsModelYear(year),
    Part(partNumber)
 { }
 
 
 // ************* Авиационные детали **********
 
 class AirPlanePart : public Part
 {
    public:
       AirPlanePart():itsEngineNumber(1){ } ;
       AirPlanePart(int EngineNumber, int PartNumber);
       virtual void Display() const
       {
          Part::Display(); cout << "Номер двигателя: ";
          cout << itsEngineNumber << endl;
       }
    private:
       int itsEngineNumber;
 };
 
 AirPlanePart::AirPlanePart(int EngineNumber, intPartNumber):
    itsEngineNumber(EngineNumber),
    Part(PartNumber)
 { }
 
 // ************** Узлы списка деталей **********
 class PartNode
 {
    public:
       PartNode (Part*);
       ~PartNode();
       void SetNext(PartNode * node) { itsNext = node; }
       PartNode * GetNext() const;
       Part * GetPart() const;
    private:
       Part *itsPart;
       PartNode * itsNext;
};
 
// Выполнение PartNode...
 
PartNode::PartNode(Part* pPart):
itsPart(pPart),
itsNext(0)
{ }
 
PartNode::~PartNode()
{
   delete itsPart;
   itsPart = 0;
   delete itsNext;
   itsNext = 0;
}
 
//Возвращается NULL, если нет следующего узла PartNode
PartNode * PartNode::GetNext() const
{
   return itsNaxt;
}
 
Part * PartNode::GetPart() const
{
   if (itsPart)
      return itsPart;
   else
      return NULL; // ошибка
}
 
// **************** Список деталей ************
class PartsList
{
   public:
      PartsList();
      ~PartsList();
      // Необходимо, чтобы конструктор-копировщик и оператор соответствовали друг другу!
      Part* Find(int & position, int PartNumber) const;
      int GetCount() const { return itsCount; }
      Part* GetFirst() const;
      static PartsList& GetGlobalPartsList()
      {
      return GlobalPartsList;
      }
      void Insert(Part *);
      void Iterate(void (Part::*f)()const) const;
      Part* operator[](int) const;
   private:
      PartNode * pHead;
      int itsCount;
      static PartsList GlobalPartsList;
};
 
PartsList PartsList::GlobalPartsList;
 
// Выполнение списка...
 
PartsList::PartsList():
   pHead(0),
   itsCount(0)
{ }
 
PartsList::^PartsList()
{
   delete pHead;
}
 
Part* PartsList::GetFirst() const
{
   if (pHead)
      return pHead->GetPart();
   else
      return NULL; // ловушка ошибок
}
 
Part * PartsList::operator[](int offSet) const
{
   PartNode* pNode = pHead;
 
   if (!pHead)
      return NULL; // ловушка ошибок
 
   if (offSet > itsCount)
      return NULL; // ошибка
 
   for (int i=0;i<offSet; i++)
      pNode = pNode->GetNext();
 
   return pNode->GetPart();
}
 
Part* PartsList::Find(int & position, int PartNumber) const
{
   PartNode * pNode = 0;
   for (pNode = pHead, position = 0;
      pNode!=NULL;
      pNode = pNode->GetNext(), position++)
   {
      if (pNode->GetPart()->GetPartNumber() == PartNumber)
         break;
   }
   if (pNode == NULL)
      return NULL;
   else
      return pNode->GetPart();
}
 
void PartsList::Iterate(void (Part::*func)()const) const
{
   if (!pHead)
      return;
   PartNode* pNode = pHead;
   do
      (pNode->GetPart()->*func)();
   while (pNode = pNode->GetNext());
}
 
void PartsList::Insert(Part* pPart)
{
   PartNode * pNode = new PartNode(pPart);
   PartNode * pCurrent = pHead;
   PartNode >> pNext = 0;
 
   int New = pPart->GetPartNumber();
   int Next = 0;
   itsCount++;
 
   if (!pHead)
   {
      pHead = pNode;
      return;
   }
 
   // Если это значение меньше головного узла,
   // то текущий узел становится головным
   if (pHead->GetPart()->GetPartNumber()->New)
   {
      pNode->SetNext(pHead);
      pHead = pHode;
      return;
   }
 
   for (;;)
   {
      // Если нет следующего, вставляется текущий
      if (!pCurrent->GetNext())
      {
         pCurrent->SetNext(pNode);
         return;
      }
 
      // Если текущий больше предыдущего, но меньше следующего, то вставляем
      // здесь. Иначе присваиваем значение указателя Next
      pNext = pCurrent->GetNext();
      Next = pNext->GetPart()->GetPartNumber();
      if (Next > New)
      {
         pCurrent->SetNext(pNode);
         pNode->SetNext(pNext);
         return;
      }
      pCurrent = pNext;
   }
}
 
int main()
{
   PartsList&pl = PartsList::GetGlobalPartsList();
   Part * pPart = 0;
   int PartNumber;
   int value;
   int Choice;
 
   while (1)
   {
      cout << "(0)Quit (1)Car (2)Plane: ";
      cin >> choice;
 
      if (!choice)
         break;
 
      cout << "New PartNumber?: ";
      cin >> PartNumber;
 
      if (choice == 1)
      {
         cout << "Model Year?: ";
         cin >> value;
         pPart = new CarPart(value,PartNumber);
      }
      else
      {
         cout << "Engine Number?: ";
         cin >> value;
         pPart = new AirPlanePart(value,PartNumber);
      }
 
      pl.Insert(pPart);
   }
   void (Part::*pFunc)()const = Part::Display;
   pl.Iterate(pFunc);
   return 0;
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.05.2015, 13:46
Цитата Сообщение от RAFA91 Посмотреть сообщение
смотрите class PartsList строка 132
Точно так же можно создать класс "треугольник" и назначить какой-то треугольник "главным". Я же о говорю об идеологической необходимости, а вовсе не о желании назначить кого-то главным и обязательно засунуть его вовнутрь класса. Идеологически тут нет никакой необходимости. Класс "список" должен обеспечивать построение списка, а выбирать какой-то список и делать его "главным" должны "наверху", причём понятие главности ещё и от конкретного применения зависит и никак не является свойством списка
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
29.05.2015, 14:33  [ТС]
благодарю за подробный анализ проблемы !

большое спасибо - буду думать !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2015, 14:33

В каких случаях требуется работа с памятью?
Приветствую всех. Интересует такой вопрос. Я знаком с основами C++. Но я читал где-то, что если разрабатывается большой проект, то работы...

Написать, в каких случаях не используется конструктор копирования
2)Написать, в каких случаях не используется конструктор копирования

В каких случаях целесообразно динамическое выделение памяти?
Здравствуйте, у меня назрел вот такой вот вопросик: Как я понимаю динамические переменные и массивы создаются с целью устранить утечки...

Так в каких случаях стоит использовать наследование?
Здравствуйте, уважаемое сообщество. После прочтения &quot;C++ Coding Standards&quot; by Herb Sutter and Andrei Alexandrescu, возникли некоторые...

В каких случаях в C++ принято прибегать к использованию шаблонов?
В каких случаях в C++ принято прибегать к использованию шаблонов? В метод или функцию я могу передать аргументы как через шаблонные...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru