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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

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

02.01.2012, 19:34. Просмотров 972. Ответов 9
Метки нет (Все метки)

Что-то я не могу понять что я забыли и чяднт что код не компилируется.
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 ===|
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2012, 19:34     Статические члены и функции
Посмотрите здесь:

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

Статические члены - C++
Мне необходимо создать класс А, причем: этот класс всегда нужен в единственном экземпляре, через этот класс работают классы В и С (т.е. в...

Статические члены класса - C++
Доброго времени суток. Задача состоит в том, чтобы создать список обыектов класса Test, с возможностью последующего добавления элементов...

Зависимости и статические члены - C++
По ходу дела, у меня возникла следующая проблема. Допустим, что у нас есть два класса. Один класс затребует второй. Второй класс...

Статические члены класса - C++
Добрый день. Проходили тему - статические члены класса. Написали программу, вылезает ошибка, помогите побороть пожалуйста. #include...

Статические массивы, члены класса - C++
необходимо создать статический массив. компилятор gcc #include&lt;iostream&gt; class c{ public: static const char x = &quot;qwe&quot;; ...

Как инициализировать статические члены класса - C++
Помогите пожалуйста....я не знаю как вывести в статическое поле значения((( #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
02.01.2012, 19:52  [ТС]     Статические члены и функции #3
Razzeeyy, ну stdio minigw подключает автоматически. А
C++
1
2
obj::setX(2);
obj::printX();
так оно тоже не работает, я ведь тоже помню что доступ к стат. функциям должен быть и так как я написал и даже без объектов вида Имя_класса::функция что в моём случае должно выглядеть как
C++
1
test::setX(2);
но minigw усердно пытается меня убедить в обратном.
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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
02.01.2012, 21:54  [ТС]     Статические члены и функции #5
C++
1
int test::x;
Это Вы намекаете на то что переменную x необходимо обязательно до main инициализировать, но зачем? Я просто всегда так и делал, наверное потому столкнулся с этой проблемой впервые, но вот в этот раз в этом необходимости не было и я считал что нулём она инициализируется сама при выполнении и без моей помощи.
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
программист С++
681 / 583 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.01.2012, 22:26     Статические члены и функции #8
Цитата Сообщение от Gepar Посмотреть сообщение
static int x;
такой синтаксис делает переменную статический для класса. Но ее еще нужно объявить, что и делается после.

а в случае, когда переменная после не была объявлена после, компилятор говорит
Цитата Сообщение от Gepar Посмотреть сообщение
undefined reference to `test::x'
мол есть статическая переменная, но не видит ее объявления
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++
Добрый вечер! Написал программку, все нормально работает, но есть два нюанса: необходимо сделать счетчик количества записей через...

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

Конструктор класса, содержащего только статические члены - C++
Практикуюсь по книге Стенли Липпмана &quot;Язык программирования C++ вводный курс&quot; 4 изд. Осваиваю главу 12.6 Статические члены класса. В...

Как правильно инициализировать статические члены класса? - C++
Я новичок и заранее прошу прощение за тупые вопросы. Имеются два класса: Solution и Pool. Pool состоит из нескольких обьектов класса...

статические функции - C++
Всем здрасьте. У меня тут впоросик на счёт static функций. я знаю как работает static с переменной. Но как он работает с функциями? к...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru