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

Статические члены и функции - C++

Восстановить пароль Регистрация
 
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
02.01.2012, 19:34     Статические члены и функции #1
Что-то я не могу понять что я забыли и чяднт что код не компилируется.
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
#include <iostream>
#include <string>
using namespace std;
 
class test
{
private:
    static int x;
public:
    static void setX(int t)
    {
        x=t;
    }
 
    static void printX()
    {
        printf("%i",x);
    }
};
 
int main()
{
    test obj;
    obj.setX(2);
    obj.printX();
}
minigw жалуется довольно странно и, судя по названию функции, линковщик запутывается в моём коде, что я не так написал?
Код ошибки:
Код
obj\Debug\main.o(.text$_ZN4test6printXEv[test::printX()]+0x7)||In function `ZN4test4setXEi':|
C:\c++\Projects\Temp\main.cpp||undefined reference to `test::x'|
obj\Debug\main.o(.text$_ZN4test4setXEi[test::setX(int)]+0x7):C:\c++\Projects\Temp\main.cpp||undefined reference to `test::x'|
||=== Build finished: 2 errors, 0 warnings ===|
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
02.01.2012, 19:51     Статические члены и функции #2
попробуй вместо этого
C++
1
2
    obj.setX(2);
    obj.printX();
вот это

C++
1
2
    obj::setX(2);
    obj::printX();
Добавлено через 1 минуту
ах да, шас попробовал у себя скомпильнуть, g++ ругается более внятно:

/home/razzeeyy/workspace/codeblocks/trash/main.cpp|17|error: ‘printf’ was not declared in this scope|
Ну я думаю теперь всё очевидно

Добавлено через 8 минут
О_О поправил 17 строку, теперь ругается очень экзотично
Код
obj/Debug/main.o||In function `test::setX(int)':|
/home/razzeeyy/workspace/codeblocks/trash/main.cpp|12|undefined reference to `test::x'|
obj/Debug/main.o||In function `test::printX()':|
/home/razzeeyy/workspace/codeblocks/trash/main.cpp|17|undefined reference to `test::x'|
||=== Build finished: 2 errors, 0 warnings ===|
Что-то мне кажется, что какое-то неправильное взаимодействие со статичным членом класса происходит...
Только я вот, что-то тоже не вижу именно в чём косяк)
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
02.01.2012, 19:52  [ТС]     Статические члены и функции #3
Razzeeyy, ну stdio minigw подключает автоматически. А
C++
1
2
obj::setX(2);
obj::printX();
так оно тоже не работает, я ведь тоже помню что доступ к стат. функциям должен быть и так как я написал и даже без объектов вида Имя_класса::функция что в моём случае должно выглядеть как
C++
1
test::setX(2);
но minigw усердно пытается меня убедить в обратном.
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
02.01.2012, 19:55     Статические члены и функции #4
Нашёл решение:
http://weblogs.asp.net/whaggard/arch...05/252685.aspx
Вот такие пироги, поздравляю вас и себя с выстрелом в ногу

вот это работает:
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 <string>
using namespace std;
 
class test
{
private:
    static int x;
public:
    static void setX(int t)
    {
        x=t;
    }
 
    static void printX()
    {
        cout<<x;
    }
};
int test::x;
 
int main()
{
    test obj;
    obj.setX(2);
    obj.printX();
}
P.S. но интересно было бы услышать экспертов по этому поводу, потому, что лично мне не понятны основания и предпосылки для такого "special case" синтаксиса...
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
02.01.2012, 21:54  [ТС]     Статические члены и функции #5
C++
1
int test::x;
Это Вы намекаете на то что переменную x необходимо обязательно до main инициализировать, но зачем? Я просто всегда так и делал, наверное потому столкнулся с этой проблемой впервые, но вот в этот раз в этом необходимости не было и я считал что нулём она инициализируется сама при выполнении и без моей помощи.
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
02.01.2012, 22:12     Статические члены и функции #6
Цитата Сообщение от Gepar Посмотреть сообщение
C++
1
int test::x;
Это Вы намекаете на то что переменную x необходимо обязательно до main инициализировать, но зачем? Я просто всегда так и делал, наверное потому столкнулся с этой проблемой впервые, но вот в этот раз в этом необходимости не было и я считал что нулём она инициализируется сама при выполнении и без моей помощи.
Честно сказать, я сам толком не знаю))) Да и не я намекаю, а интернет намекает
Я дал ссылку выше, там сказано:
You need to declare it outside the class because otherwise the compiler doesn't know which translation unit (hence object file) the member is supposed to go.

One of the drawbacks of C++'s rather archaic compilation model.
Как видим, это скорее всего как-то связано с обратной совместимостью, может с C, а может и со старыми стандартами.

Добавлено через 5 минут
И еще цитатка
Static data members must be defined out side of class definition, because they don't belong to any specific instance of the class.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
02.01.2012, 22:25     Статические члены и функции #7
Цитата Сообщение от Razzeeyy Посмотреть сообщение
Static data members must be defined out side of class definition, because they don't belong to any specific instance of the class.
так точно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class test {
private:
    static int x;
public:
    static void setX(int t);
    static void printX();
};
 
 
int test::x;
 
void test::setX(int t) {
    x = t;
}
 
void test::printX() {
    printf("%i", x);
}
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "test.h"
 
int main() {
 
test::setX(10);
test::printX();
 
test obj;
obj.setX(2);
obj.printX();
 
return 0;
}
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.01.2012, 22:26     Статические члены и функции #8
Цитата Сообщение от Gepar Посмотреть сообщение
static int x;
такой синтаксис делает переменную статический для класса. Но ее еще нужно объявить, что и делается после.

а в случае, когда переменная после не была объявлена после, компилятор говорит
Цитата Сообщение от Gepar Посмотреть сообщение
undefined reference to `test::x'
мол есть статическая переменная, но не видит ее объявления
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
02.01.2012, 22:38     Статические члены и функции #9
sandye51, хм, весьма неочевидное, я бы сказал поведение... С таким же успехом я могу просто обьявить глобальную переменную в еденице трансляции и всё будет ок О_О Класс он как бы, имхо подразумевает, что он "целостный" обьект... А тут мы получается "привязываем", что-ли, внешнюю переменную к классу...

100% это явилось следствием сохранение какой-то обратной совместимости <_<
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2012, 00:54     Статические члены и функции
Еще ссылки по теме:

Статические члены C++
C++ Статические члены класса
Классы (статические члены и конструктор копирования) C++

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

Или воспользуйтесь поиском по форуму:
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
03.01.2012, 00:54     Статические члены и функции #10
Razzeeyy, я может немного неправильно выразился, что ты понял как "привязываем".
просто такое правило - статические члены, как данные, так и методы - должны быть определены
Yandex
Объявления
03.01.2012, 00:54     Статические члены и функции
Ответ Создать тему
Опции темы

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