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

Статические свойства классов - C++

Восстановить пароль Регистрация
 
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
03.04.2014, 18:41     Статические свойства классов #1
Есть класс со статическим свойством
C++
1
2
3
4
5
6
7
8
class Data
{
protected:
   static char *str, *newStr;
   static unsigned long writedBytes, curPos, strLen, i, flags;
   // ...
 
}
Я понимаю что статические свойства перед использованием нужно объявить, но где объявлять protected static?
Раньше у меня они были в паблике и я их объявлял просто вначале .cpp файла. Я пробовал их объявлять в методе init() который вызывается перед первым использованием
C++
1
2
3
4
5
void Data::init()
{
   char *Data::str, *Data::newStr;
   unsigned long Data::writedBytes, Data::curPos, Data::strLen, Data::i, Data::flags;
}
но тогда на каждое свойство кидало такую ошибку
Код
error: invalid use of qualified-name 'Data::str'
error: invalid use of qualified-name 'Data::newStr'
...
дак где же protected и private static объявлять?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2014, 18:41     Статические свойства классов
Посмотрите здесь:

Статические библиотеки C++
статические массивы C++
C++ Массивы(статические)
статические массивы C++
Статические переменные C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
03.04.2014, 18:58     Статические свойства классов #2
Цитата Сообщение от OrmaJever Посмотреть сообщение
дак где же protected и private static объявлять?
да там и объявлять, только обращаться к ним через статические методы.
Цитата Сообщение от OrmaJever Посмотреть сообщение
статические свойства перед использованием нужно объявить
по умолчанию инициализируются нулями кстати.
Цитата Сообщение от OrmaJever Посмотреть сообщение
но тогда на каждое свойство кидало такую ошибку
Цитата Сообщение от OrmaJever Посмотреть сообщение
unsigned long Data::writedBytes
это объявление о обращение в одном флаконе, вот и ошибка.
C++
1
unsigned long writedBytes
Вот это объявление (прошу заметить локальной переменной).
C++
1
Data::writedBytes
А вот это обращение к уже объявленной переменной.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
03.04.2014, 19:08  [ТС]     Статические свойства классов #3
Так, это я понял. Теперь такой вопрос, как к ним обращаться из текущего класса и из наследников?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.04.2014, 19:12     Статические свойства классов #4
Цитата Сообщение от OrmaJever Посмотреть сообщение
Я понимаю что статические свойства перед использованием нужно объявить,
Может инициализировать (определить)?
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
03.04.2014, 19:22     Статические свойства классов #5
Цитата Сообщение от OrmaJever Посмотреть сообщение
как к ним обращаться из текущего класса и из наследников?
Если public, то через имя класса и ::
C++
1
Data::writedBytes
В базовом классе можно напрямую, в наследнике только если public или protected.
а если private, то через методы .
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
#include <iostream>
#include <stdexcept>
 
class ClassA
{
    public:       
        int getX() const
        {
            return x;
        }
        
    private:
        static const int x = 10;
};
 
class ClassB: public ClassA
{
    public:
        void print() const
        {
            std::cout << getX() << std::endl;
        }
};
 
 
int main()
{
    ClassB b;
    b.print();
    return 0;
}
не компилил, могут быть ошибки.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
03.04.2014, 19:29  [ТС]     Статические свойства классов #6
хмм... вот ещё проблема вылезла, в Data есть protected метод
C++
1
Data &operator<< ( const char );
из наследника раньше (когда он был в паблике) обращался так
C++
1
*this << ...
а теперь пишет
Код
error: 'Data& Data::operator<<(char)' is protected
как тогда к нему обратиться ?
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
03.04.2014, 19:39     Статические свойства классов #7
Цитата Сообщение от OrmaJever Посмотреть сообщение
как тогда к нему обратиться ?
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
#include <iostream>
 
class ClassA
{        
    protected:
        static const int x = 10;
        
        ClassA& operator<<(const char c)
        {
            std::cout << "operator<<" << std::endl;
        }
};
 
class ClassB: public ClassA
{
    public:
        void print()
        {
            std::cout << x << std::endl;   //ClassA:: не обязательно
        }
        
        void doSmth()
        {
            (*this)<<'c';   //обращаемся
        }
};
 
 
int main()
{
    ClassB b;
    b.print();
    b.doSmth();
    return 0;
}
В наследнике все protected должны быть видны. Может унаследовать забыли, или тип наследование изменили с public на protected?
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
03.04.2014, 19:52  [ТС]     Статические свойства классов #8
ладно если обращение через *this должно работать значит буду искать сам ошибку.
Цитата Сообщение от dimcoder Посмотреть сообщение
или тип наследование изменили с public на protected?
раз зашла за это речь можете мне объяснить какие бывают "типы наследования", и чем они отличаются? Я всегда использую public.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
03.04.2014, 20:01     Статические свойства классов #9
Цитата Сообщение от OrmaJever Посмотреть сообщение
ладно если обращение через *this должно работать
можно без this
C++
1
2
3
4
void doSmth()
        {
            operator<<('c');
        }
Цитата Сообщение от OrmaJever Посмотреть сообщение
и чем они отличаются?
Если public, то все public остаются public, protected остаются protected, private остаются private.
Если protected, то все public становятся protected, protected становятся private, private остаются private.
Если private, то все public становятся private, protected становятся private, private остаются private.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
03.04.2014, 20:40  [ТС]     Статические свойства классов #10
ладно, с protected я могу понять, но private то зачем?? зачем наследовать класс без ничего (всё приватное), только ради типа ?
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
03.04.2014, 21:19     Статические свойства классов #11
Цитата Сообщение от OrmaJever Посмотреть сообщение
но private то зачем
protected, private наследование - это нечастое явление. Сам я его еще не использовал.
Цитата Сообщение от OrmaJever Посмотреть сообщение
зачем наследовать класс без ничего
не совсем так... public и protected методы будут так же доступны внутри наследника, но через наследника уже этот метод не позовешь т.к. он стал private. Пример лучше покажет
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
#include <iostream>
 
class ClassA
{
    public:
        void func1()
        {
            std::cout << "func1 calls func2" << std::endl;
            func2();
        }
        
    protected:
        void func2()
        {
            std::cout << "func2 calls func3" << std::endl;
            func3();
        }
        
    private:
        void func3()
        {
            std::cout << "func3 has been called" << std::endl;
        }
};
 
class ClassB: private ClassA
{
    public:
        void callFunc1()
        {
            std::cout << "b calls func1()" << std::endl;
            func1();
        }
};
 
class ClassC: public ClassA
{  
};
 
 
int main()
{
    ClassB b;
    ClassC c;
    b.callFunc1();
    //b.func1();   //error
    std::cout << "c calls func1()" << std::endl;
    c.func1();
    
    system("PAUSE>NULL");
    return 0;
}
b.func1() позвать нельзя, потому-что он стал private. А если наследовать через public, то можно было бы позвать, что c.func1() и доказывает.
Если говорить конкретно зачем оно надо - для композиции. Private наследование - это так называемое has-a наследование (один класс содержит другой как член. Пример: класс Машина содержит мотор), но не is-a(public наследование - это is-a) (машина - это не мотор). Мы можем обращаться к мотору через интерфейс - педали. Машина сама работает с мотором, водителю нужно знать только про педали. Так и здесь: main'y не надо знать про func1(), у него есть "педали" callFunc1(). Так почему бы просто не использовать композицию? Через композицию protected члены не будут видны, а через наследование будут.
Надеюсь, хоть что то да прояснилось.
PS Может эксперты пример получше приведут, уже с более реальной задачей.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
04.04.2014, 18:22  [ТС]     Статические свойства классов #12
Вопрос из первого поста мне всё таки решить не удалось. Закинул в protected статические свойства
C++
1
2
3
4
5
6
7
8
class Data
{
protected:
   static char *str, *newStr;
   static unsigned long writedBytes, curPos, strLen, i, flags;
   // ...
 
}
затем создал публичный статический метод init (в классе Data)
C++
1
2
3
4
5
void Data::init()
{
   char *str, *newStr;
   unsigned long writedBytes, curPos, strLen, i, flags;
}
он вызывается перед любым использованием этих свойств, но линковщик ругается
Код
undefined reference to `Data::strLen'
undefined reference to `Data::str'
...
почему он не находит их определения, и где оно должно быть?
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
04.04.2014, 19:05     Статические свойства классов #13
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
#include <iostream>
#include <iomanip>
 
class Data
{
    public:
        void init();
    protected:
        static char *str, *newStr;
        static unsigned long writedBytes, curPos, strLen, i, flags;
};
 
void Data::init()
{ 
    std::cout << "init" << std::endl;
   //char *str, *newStr;    //это просто объявление локальных переменных, но не инициализация
   //unsigned long writedBytes, curPos, strLen, i, flags;   //
}
 
int main()
{
    Data d;
    d.init();
        
    system("PAUSE>NULL");
    return 0;
}
Все компилится.
Я кажется понял что конкретно вы хотите сделать.
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
#include <iostream>
#include <iomanip>
 
class Data
{
    public:
        void init();
    protected:
        static char c;
        static char *str, *newStr;
        static unsigned long writedBytes, curPos, strLen, i, flags;
        
};
 
char Data::c = 'c';
unsigned long Data::writedBytes = 10;
 
class MoreData: public Data
{
    public:
        void doSmth()
        {
            std::cout << Data::c << std::endl << Data::writedBytes << std::endl;
        }   
};
 
int main()
{
    MoreData md;
    md.doSmth();
    system("PAUSE>NULL");
    return 0;
}
Если это не то, что я думая выложите Ваш код.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
04.04.2014, 19:33  [ТС]     Статические свойства классов #14
dimcoder, вы как-то в очередной раз угадали, я сделал как раньше, определение этих переменных просто вначале cpp файла и это заработало! Но я вообще не могу понять почему это работает??? Если свойство protected они не может быть видно за пределами класса и наследников, как может работать такая запись??
C++
1
2
3
4
5
6
7
8
class Data
{
    protected:
        static char *str, *newStr;
        static unsigned long writedBytes, curPos, strLen, i, flags; 
};
char *Data::str, *Data::newStr;
unsigned long Data::writedBytes, Data::curPos, Data::strLen, Data::i;
они ведь protected, мне такое даже в голову не пришло протестить.
Цитата Сообщение от dimcoder Посмотреть сообщение
Я кажется понял что конкретно вы хотите сделать.
Если вы про protected static то суть такая: Есть класс Data и несколько от него потомков (А, В, С), есть строка которую нужно обработать (по символьно), в зависимости от разных символов строку могут обрабатывать разные потомки (потомки не статические поэтому для обработки создаётся объект), например строка из 30 символов, 0-10 обрабатывает класс А, второй десяток класс С, третий класс В. И вот что бы все объекты работали с одной и той же строкой, позицией они должны быть статическим, а protected потому что к этой строке должны иметь доступ только потомки и недай бог изменить её из вне. Класс Data содержит общие служебные методы (для обработки строки) и вот эти статические свойства.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2014, 21:07     Статические свойства классов
Еще ссылки по теме:

Статические объекты C++
C++ Статические свойства структур в заголовочных файлах
C++ Статические функции

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

Или воспользуйтесь поиском по форуму:
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
04.04.2014, 21:07     Статические свойства классов #15
Цитата Сообщение от OrmaJever Посмотреть сообщение
Если свойство protected они не может быть видно за пределами класса и наследников, как может работать такая запись??
Его и не видно. А эта запись - это определение. По такому же принципу как с методами:
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
protected:
    void func(); // объявление
    static int var; //объявление
    static void func_static(); //объявление
};
 
void A::func() {} // определение (причем не обязательно в том же файле, главное что после типа А, т.е. А должно быть видно в месте определения)
int A::var = 10; // определение и инициализация
void A::static_func() { } // определение
Yandex
Объявления
04.04.2014, 21:07     Статические свойства классов
Ответ Создать тему
Опции темы

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