2013-06-11 4 views
0

, так что я получил что-то вроде этого:Реферирование члена нестатического класса в статической функции

//somewhere in the class header 
static void bar(); 
Someobj baz; 


//meanwhile in the implementation 
void foo::bar() 
{ 
    baz.f()//this doesn't work b/c baz isn't declared as static 
} 

Должен ли я объявить все, что я хочу использовать в статической функции Foo как статический также являюсь или там лучший способ?

+0

Статические методы не являются экземплярами (т. Е. Не подразумевается «этот» указатель), поэтому вызов метода экземпляра из статического метода невозможен. Вы можете передать указатель или ссылку на свой класс в качестве параметра на свой статический метод и вызвать нестатические методы с помощью этого параметра. – franji1

+0

@ franji1: Очень распространенное заблуждение - методы экземпляров, безусловно, могут быть вызваны с помощью функции-члена 'static', используя оператор доступа' .' к объекту. –

+0

Предлагаемый дубликат неверен, потому что этот вопрос с названием заголовка вводит в заблуждение. Голосование за повторное открытие. – RandomSeed

ответ

0

Да, так и есть. Если у вас есть 10 объектов, и у каждого из них есть свой собственный baz, тогда как bar должен знать, с каким номером baz вы говорите?

Не может. Вот почему у вас может быть только один baz, а также статический.

0

Статические функции похожи на глобальные функции, с ними нет связанного экземпляра, поэтому вы не можете ссылаться на член экземпляра. Если вам нужен один объект baz, связанный с этим классом, сделайте его также статическим. В противном случае вам нужно изменить свою логику.

+0

Как я могу изменить логику? Я работаю с opengl, и это функции отображения и изменения как статические по своей природе, так и настройки для этого? – cypomi

+0

Если ваш статический метод может принимать параметры, передайте ему соответствующий баз в качестве параметра. Все остальное, и вам нужен какой-то глобальный способ доступа к нему. – Lochemage

+0

Вы можете передать baz в качестве аргумента, но, возможно, вам нужно сделать bar функцией экземпляра. Вы также можете сделать baz static. Или вы можете сделать бар автономной функцией. – perreal

Смежные вопросы