Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

02.01.2012, 19:34. Просмотров 1022. Ответов 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 ===|
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2012, 19:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Статические члены и функции (C++):

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

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

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

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

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

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

9
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 ===|
Что-то мне кажется, что какое-то неправильное взаимодействие со статичным членом класса происходит...
Только я вот, что-то тоже не вижу именно в чём косяк)
0
Gepar
1177 / 533 / 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 усердно пытается меня убедить в обратном.
0
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
02.01.2012, 19:55 #4
Нашёл решение:
http://weblogs.asp.net/whaggard/archive/2004/11/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" синтаксиса...
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
02.01.2012, 21:54  [ТС] #5
C++
1
int test::x;
Это Вы намекаете на то что переменную x необходимо обязательно до main инициализировать, но зачем? Я просто всегда так и делал, наверное потому столкнулся с этой проблемой впервые, но вот в этот раз в этом необходимости не было и я считал что нулём она инициализируется сама при выполнении и без моей помощи.
0
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.
0
greeezz
273 / 166 / 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;
}
0
sandye51
программист С++
685 / 587 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.01.2012, 22:26 #8
Цитата Сообщение от Gepar Посмотреть сообщение
static int x;
такой синтаксис делает переменную статический для класса. Но ее еще нужно объявить, что и делается после.

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

100% это явилось следствием сохранение какой-то обратной совместимости <_<
0
sandye51
программист С++
685 / 587 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
03.01.2012, 00:54 #10
Razzeeyy, я может немного неправильно выразился, что ты понял как "привязываем".
просто такое правило - статические члены, как данные, так и методы - должны быть определены
0
03.01.2012, 00:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2012, 00:54
Привет! Вот еще темы с ответами:

Классы (статические члены и конструктор копирования) - C++
Добрый вечер! Написал программку, все нормально работает, но есть два нюанса: необходимо сделать счетчик количества записей через...

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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