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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2013, 02:25   #1
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию Статическая функция класса в С++

Доброй ночи. -> Доброго утра. -> Доброго дня.

Помогите пожалуйста. Это мне точно одному не разрешить.
Не могу вызвать функцию рисования объекта через указатель в классе в статической функции класса.

Код:

class TPlayingField{
private:
    int w, h;	
public:
	static void draw();
	TGun *pGun;

};

void TPlayingField::draw() // функция рисования
{
//!!!   pGun->paint();   - ошибка
	glutFullScreen();
	glClear (GL_COLOR_BUFFER_BIT); // очистка экрана 
	glutSwapBuffers ();

}
error C2227: выражение слева от "->paint" должно указывать на тип класса, структуры или объединения либо на универсальный тип
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 03.05.2013, 02:36   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

pGun тоже статическое должна быть тогда.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.05.2013, 02:39   #3
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
pGun тоже статическое должна быть тогда.
Мне теперь все зависимые функции статическими делать что ли?
У меня просто это не одна такая функция.
Не делать же все классы статическими!!!!!
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 03.05.2013, 05:08   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

почему все?
делаете переменную статической, и тогда через эту переменную получаете доступ к методам.
у вас синглетон на лицо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.05.2013, 09:21   #5
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
делаете переменную статической, и тогда через эту переменную получаете доступ к методам.
у вас синглетон на лицо.
Я не понимаю как это реализовать. Помогите пожалуйста. Пробую

Код:
public:
	static void draw();
	TLineBall *pLineBall;
	TGun *pGun;
	static TGun *p;
Код:
void TPlayingField::draw() // функция рисования
{
	p->paint();
	glutFullScreen();
error LNK2001: неразрешенный внешний символ ""public: static class TGun * TPlayingField:" (?p@TPlayingField@@2PAVTGun@@A)"
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 03.05.2013, 10:19   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Не могу вызвать функцию рисования объекта через указатель в классе в статической функции класса.
Неудивительно. Статическая функция-член не получает указателя на вызвавший объект (т.е. this для неё не существует). Соответственно, даже если бы синтаксически Вы могли её так вызвать, её поведение всё равно бы не могло зависеть от того, для какого объекта она вызвана (ведь pGun в теле метода - это "на самом деле" this->pGun).

В связи с чем, возникает вопрос: а почему у Вас функция с названием, обозначающим применяемое к объекту действие (draw) является статической?
Abstraction вне форума Ответить с цитированием
Старый 03.05.2013, 10:38   #7
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
В связи с чем, возникает вопрос: а почему у Вас функция с названием, обозначающим применяемое к объекту действие (draw) является статической?
Потому что используются функции библиотеки Glut (OpenGL). По другому у меня glutDisplayFunc(draw); не принимает функцию перерисовки окна

она просит
void (*func)()
а не
void (TPlayingField::*)()
Человек

Последний раз редактировалось Артём Волжанкин; 03.05.2013 в 10:42.
Артём Волжанкин вне форума Ответить с цитированием
Старый 03.05.2013, 10:47   #8
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

/* GLUT window callback sub-API. */
extern void APIENTRY glutDisplayFunc(void (*func)(void));
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 03.05.2013, 11:10   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
По другому у меня glutDisplayFunc(draw); не принимает функцию перерисовки окна
И? У меня для Вас плохие новости: аргумент glutDisplayFunc не сможет впрямую обратиться к нестатическим полям каких-либо объектов, и аргументов ей тоже не положено. То есть, любое изменение её поведения возможно только через глобальные объекты (например, статические члены тех или иных классов). Добро пожаловать в мир OpenGL, так сказать.
Так что смысл включения draw как члена какого-то конкретного класса есть, но в принципе, её с тем же успехом можно объявить просто функцией, не входящей в какой-либо класс. Исходите из этого.

Можно написать примерно так (давно не брал в руки этих шашек, так что не поручусь за оптимальность):
Код:
class TPlayingField{
private:
    int w, h;	
public:
	void draw();
	TGun *pGun;

};

TPlayingField* currentField;

void DrawCurrentField(void){
  currentField->draw();
}

void TPlayingField::draw() // функция рисования
{
        pGun->paint();   //не ошибка
	glutFullScreen();
	glClear (GL_COLOR_BUFFER_BIT); // очистка экрана 
	glutSwapBuffers ();

}

Последний раз редактировалось Abstraction; 03.05.2013 в 11:15.
Abstraction вне форума Ответить с цитированием
Старый 03.05.2013, 11:42   #10
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

только теперь на это ругается

glutDisplayFunc(draw)

она просит
void (*func)()
а не
void (TPlayingField::*)()
Человек
Артём Волжанкин вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция базового класса вызывает критическую ошибку при вызове для класса-потомка Archet Общие вопросы C/C++ 7 17.01.2012 20:17
функция, возвращающая экземпляр класса Juffin Общие вопросы Delphi 2 01.11.2010 17:42
Функция - член класса Syltan Общие вопросы C/C++ 9 06.10.2009 23:44
Указатеть на функция-член класса BioS Общие вопросы C/C++ 6 29.09.2009 00:04
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50