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

Статические поля класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 119, средняя оценка - 4.85
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
26.08.2010, 21:47     Статические поля класса #1
C++
1
2
3
4
5
6
7
8
class mi {
   int a,b;
 
public: mi(int a, int b) : a(a),b(b) {}
         void  sw() { std::cout<<a<<" - "<<b<<std::endl; }
         static int pa = 9;
    
};
мне нужно сделать переменную в классе статическую и публичную. но как я понял это возможно сделать только внутри какойто функции?
а просто как у меня в коде нельзя?
пишет ошибку - error C2252: 'pa' : pure specifier can only be specified for functions
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2010, 21:47     Статические поля класса
Посмотрите здесь:

C++ Статические члены класса
C++ Статические члены класса
Статические поля и наследование C++
C++ статические поля класса
C++ Статические поля и методы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.08.2010, 21:50     Статические поля класса #2
В private раздел перенес из за личных предпочтений

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
class mi {
   int a,b;
   static int pa;
 
public: mi(int a, int b) : a(a),b(b) {pa=9;}
         void  sw() { std::cout<<a<<" - "<<b<<std::endl; }
        
};
Rockedit
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1752 / 558 / 9
Регистрация: 22.12.2009
Сообщений: 1,544
26.08.2010, 21:58     Статические поля класса #3
Попросту говоря , статическая переменная может быть инициализированная только в конструкторе класса, т.к. она сушествует еще до создания экземпляра данного класса.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
26.08.2010, 22:02     Статические поля класса #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Инициализация статических членов класса делается в .cpp файле в таком виде:
C++
1
int mi::pa = 0;
Инициализация в конструкторе статического члена приведёт к тому, что значение будет обнуляться каждый раз при создании екземпляра класса.
Rockedit
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1752 / 558 / 9
Регистрация: 22.12.2009
Сообщений: 1,544
26.08.2010, 22:04     Статические поля класса #5
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
Инициализация статических членов класса делается в .cpp файле в таком виде:
C++
1
int mi::pa = 0;
Инициализация в конструкторе статического члена приведёт к тому, что значение будет обнуляться каждый раз при создании екземпляра класса.
И правда, чтото не подумал, что бред написал. Я имел в виду статический конструктор.
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
26.08.2010, 22:11  [ТС]     Статические поля класса #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
class mi {
    int a,b;
                public: mi(int a, int b) : a(a),b(b) {}
           void sw() { std::cout<<a<<" - "<<b<<std::endl; }
                  static int pa;
};
 
int main() {
int  mi::pa = 8;
 
mi alpha(2,4);
alpha.sw();
return 0;
 
}
error C2655: 'pa' : definition or redeclaration illegal in current scope
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.08.2010, 22:11     Статические поля класса #7
Krist_ALL, э. ну не в функции же. в глобальном надо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
class mi {
   int a,b;
   static int pa;
 
public: mi(int a, int b) : a(a),b(b) {}
        void  sw() { std::cout<<a<<" - "<<b<<std::endl; }        
};
 
int mi::pa=9;
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
26.08.2010, 22:12     Статические поля класса #8
C++
1
int  mi::pa = 8;
Инициализация должна быть вне функции.

C++
1
2
int  mi::pa = 8;
int main() {
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
26.08.2010, 22:14  [ТС]     Статические поля класса #9
и как добраться до обычных переменных и статических тоже вне класса?
чет в книге ничего нет(
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
26.08.2010, 22:24     Статические поля класса #10
Цитата Сообщение от Krist_ALL Посмотреть сообщение
и как добраться до обычных переменных и статических тоже вне класса?
чет в книге ничего нет(
Назовите, откуда и к каким переменным вы хотите добраться.
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
26.08.2010, 22:40  [ТС]     Статические поля класса #11
1 - почему дать значение статической переменной можно только вне маин?
2 - хочу вывести значение статической переменной не используя функцию класса а из вне. mi fa; cout <<fa.a как то так
3 - и как добраться до переменныз не статических тоже из вне.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.08.2010, 22:44     Статические поля класса #12
Krist_ALL,
1. Вне функций вцелом.
2. Не выводится?
У меня вполне:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
class mi {
   int a,b;
 
public: mi(int a, int b) : a(a),b(b) {}
        mi(){}
        void  sw() { std::cout<<a<<" - "<<b<<std::endl; }        
        static int pa;
};
 
int mi::pa=9;
 
int main()
{
   mi n;
   std::cout<< n.pa <<'\n';
   return 0;
}
3. Засунуть их в паблик (не рекомендуется), создать специальные функции, одна из которых задает значение, вторая возвращает.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
26.08.2010, 22:45     Статические поля класса #13
Цитата Сообщение от Krist_ALL Посмотреть сообщение
1 - почему дать значение статической переменной можно только вне маин?
Речь идёт о первичной инициализации. Статическое поле класса - это фактически глобальная переменная.
2 - хочу вывести значение статической переменной не используя функцию класса а из вне. mi fa; cout <<fa.a как то так
C++
1
std::cout << mi::fa;
3 - и как добраться до переменныз не статических тоже из вне.
C++
1
2
mi m1;
std::cout << m1.a;
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.08.2010, 22:47     Статические поля класса #14
Andrew_Lvov, А вот по 3 не согласен. Надо бы дописать, что только если переменные в паблике.
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
26.08.2010, 22:51  [ТС]     Статические поля класса #15
понял спасибо всем большое - буду постигать ооп!
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
26.08.2010, 22:52     Статические поля класса #16
Lavroff,
Да, вы правы, я не заметил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class MyClass
{
  int a, b;
public:
  MyClass():a(0),b(0)
  {}
  int getA() {
    return a;
  }
  int getB() {
    return b;
  }
};
 
int main()
{
  MyClass c;
  std::cout << c.getA() << " " << c.getB() << std::endl;
}
UPD: поправлено
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.08.2010, 22:55     Статические поля класса #17
Andrew_Lvov, И опять тоже самое=)
C++
1
std::cout<< c.getA()<<' '<<c.getB()<<std::endl;
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
26.08.2010, 23:25     Статические поля класса #18
Цитата Сообщение от Rockedit Посмотреть сообщение
Я имел в виду статический конструктор.
В C++ нет статических конструкторов.
Krist_ALL, совместить определение с объявлением можно только, если статическое поле константно:
C++
1
2
3
4
class Foo {
private:
  static const int bar = 5;
};
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,662
27.08.2010, 01:45     Статические поля класса #19
Цитата Сообщение от Krist_ALL Посмотреть сообщение
1 - почему дать значение статической переменной можно только вне маин?
Статический член класса должен быть определен в той же области видимости, что и класс.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2014, 10:52     Статические поля класса
Еще ссылки по теме:

Статические поля и unresolved символы C++
C++ Чем отличаются статические поля от не статических?
C++ Статические методы класса (static)

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2014, 10:52     Статические поля класса #20
Цитата Сообщение от Krist_ALL Посмотреть сообщение
мне нужно сделать переменную в классе статическую и публичную. но как я понял это возможно сделать только внутри какойто функции?
Только вне каких либо функций.
Yandex
Объявления
24.02.2014, 10:52     Статические поля класса
Ответ Создать тему
Опции темы

Текущее время: 07:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru