Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2016, 09:20   #1
Григоренко Степан
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 35
Вопрос Проблема со static членом и методом

Здравствуйте.
Такой вопрос, поиск и гуглёж не помог:
Компилятор i486-pc-nto-qnx6.5.0-c++-4.4.2, собираю для QNX из-под Винды.
Есть статический метод класса Insertion. Экземпляр класса планируется один в проекте.

Код:
class MprsClass{
public:	
							MprsClass();
							~MprsClass();
	........................
private:

        ........................
	static struct usbd_desc_node	*node;
	static void 			Insertion(struct usbd_connection *connection, usbd_device_instance_t *instance);
};
Методу нужна переменная node. Так как метод статический, то и node тоже статическая.
Но компилятор ругается:
In function `MprsClass::MprsClass()':
MprsClass.cpp.text+0x4e): undefined reference to `MprsClass::node'
In function `MprsClass::Insertion(usbd_connecti on*, usbd_device_instance*)':
MprsClass.cpp.text+0x236): undefined reference to `MprsClass::node'


В сишнике пытался обратиться и как
Код:
MprsClass::MprsClass(){
	MprsClass::node = NULL;
}
и просто как
Код:
MprsClass::MprsClass(){
	node = NULL;
}
, говорит то же самое.

В результате порешал костылём, вынес node как глобальную переменную в .срр файл. Но я не понимаю, отчего такая фигня творится.
Григоренко Степан вне форума Ответить с цитированием
Старый 07.04.2016, 09:28   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Потому что объявить их вы объявили, а память не выделили. В любой книжке про статик сказано, что после объявления необходимо в единице трансляции (в ццп у вас написать), типа,
Цитата:
struct usbd_desc_node *MprsClass::node = nullptr;
А не ваши присваивания в конструкторе.
p51x вне форума Ответить с цитированием
Старый 07.04.2016, 09:38   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А зачем struct писать при объявлении если С++, а не С?
Цитата:
В результате порешал костылём, вынес node как глобальную переменную в .срр файл.
В чем костыль если она все равно private?

static private вещи часто выносят в анонимный неймспейс в .cpp

Код:
namespace {
    void func() { }

    int var = 0;
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.04.2016, 09:51   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
В чем костыль если она все равно private?
Он ее вообще сделал глобальной, без класса...
p51x вне форума Ответить с цитированием
Старый 07.04.2016, 10:00   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так я о том, что использовать переменные/функции в .cpp (желательно в анонимном неймспейсе) вместо static private в классе это вполне нормальная практика.

Наверно в большинстве случаев так даже лучше потому что например
1. Можно менять (тип, имя) или удалять этот код без перекомпиляции всего, что заинклюдило это хедер.
2. При изменении или удалении кода надо делать это только в 1 месте вместо 2.
3. Пользователь хедер файла не утомляется чтением не нужных ему вещей
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.04.2016, 09:14   #6
Григоренко Степан
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 35
По умолчанию

Alex11223, благодарю за пояснение.
p51x, заработало.

Спасибо большое всем, кто откликнулся :}
Григоренко Степан вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти сумму ряда, оканчивающегося N-ым членом. N вводится с клавиатуры. Julia_Sv Паскаль, Turbo Pascal, PascalABC.NET 3 01.02.2016 22:07
Как определить каким членом рабочей группы является пользователь AppData Общие вопросы Delphi 1 23.08.2014 08:57
Написать программу решения уравнения методом дихотомии, комбинированным методом секущих хорд, методом простых итераций (на C++) Bloody_Mary Помощь студентам 0 14.05.2014 21:05
static и non-static context kos1nus Общие вопросы по Java, Java SE, Kotlin 1 17.07.2013 00:10
Вычислить N-й член арифметической прогрессии с шагом K и первым членом A. atenon Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 24.10.2012 17:47