Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по синтаксису

31K
28 июля 2010 года
deadok
16 / / 15.01.2008
имеется класс.
Код:
class rect {
public:
    void square(void);
    void func(void);
};
void rect::square(void) {
     void (*pFunc)(void);
     pFunc = square; // ошибка синтаксиса
}
void rect::func(void) {
     void (*pFunc)(void);
     pFunc = square; // ошибка синтаксиса    
}

необходимо создать указ-ль на функцию square внутри самой функции square и указ-ль на ф-ю square внутри любой другой ф-ии класса rect. как?
2.1K
28 июля 2010 года
Norgat
452 / / 12.08.2009
Код:
class rect {
public:
    void square(void);
    void func(void);
};
void rect::square(void) {
    void (rect::* pFunc)(void);
    pFunc = &rect::square;
}
void func(void) {
    void (rect::* pFunc)(void);
    pFunc = &rect::square;
}


VS2008 не ругается. работу не тестировал.
31K
28 июля 2010 года
deadok
16 / / 15.01.2008
то, что нужно. спасибо.
31K
28 июля 2010 года
deadok
16 / / 15.01.2008
возник попутный вопрос. как теперь нужно вызвать указатель pFunc чтобы он выполнил те же действия, что и square?
2.1K
28 июля 2010 года
Norgat
452 / / 12.08.2009
Цитата: deadok
возник попутный вопрос. как теперь нужно вызвать указатель pFunc чтобы он выполнил те же действия, что и square?



Код:
class rect {
public:
    void square();
    void func();
};
void rect::square() {
    void (rect::* pFunc)();
    pFunc = &rect::square;
    (this->*pFunc)();
}
void func(rect A, rect* B) {
    void (rect::* pFunc)();
    pFunc = &rect::square;
    (A.*pFunc)();
    (B->*pFunc)();
}
31K
29 июля 2010 года
deadok
16 / / 15.01.2008
большое спасибо
31K
31 июля 2010 года
deadok
16 / / 15.01.2008
к сожалению приходится поднимать тему, т.к. за эти 2 дня окончательно вывихнул себе мозг разбираясь с указателями, ссылками итп применительно к классам...
итак, имеется класс...
Код:
class figure {
public:
    int id;               // идентификатор
    bool inited;        // "триггер" для впихивания print в вектор print_vector
    void draw(void);
    void print(void);
};


void figure::print(void) {
     std::cout << id << std::endl; // вывод id
}


void figure::draw(void) {
     static std::vector<void (figure::*)(void)> print_vector;
   
      if(!inited) {
          print_vector.push_back(&figure::print); // записали адрес print в print_vector
          inited = true;
     }

     // вызов элемента print_vector
     (this->*print_vector[0])();
}

теперь что написано в main программе
Код:
// объявим несколько объектов типа figure
figure square, circle, triangle;

void main(void) {
      // присвоим каждой фигуре id
      square.id = 1;
      circle.id = 2;
      triangle.id = 3;

      // вывод id фигур
      square.draw();
      circle.draw();
      triangle.draw();    
}

мне казалось, что если вызывается
 
Код:
(this->*print_vector[0])(); // первый элемент вектора, т.е. первой будет square.print
внутри figure::draw, то соответственно в консоли должно выводится square.id три раза подряд
 
Код:
1
1
1

но вместо этого выводятся square.id, circle.id, triangle.id
 
Код:
1
2
3

при этом, если бы было написано так
 
Код:
(this->*print_vector[1])();
или
 
Код:
(this->*print_vector[2])();
все равно выводится
 
Код:
1
2
3

ПОЧЕМУ?! ведь поидее
 
Код:
(this->*print_vector[0])();
предполагает вызов функции print именно фигуры square, а не circle или triangle. моей главной целью является фиксация функции print всех figure и вызов их по мере надобности. как быть? надеюсь написал не слишком запутано
2.1K
31 июля 2010 года
Norgat
452 / / 12.08.2009
Цитата:
ПОЧЕМУ?! ведь поидее
Код:
(this->*print_vector[0])();
предполагает вызов функции print именно фигуры square, а не circle или triangle. моей главной целью является фиксация функции print всех figure и вызов их по мере надобности. как быть? надеюсь написал не слишком запутано



ммм... дело в том, что каждому не статическому методу класса, при его вызове, неявно передаётся указатель на экземпляр класса. возможно в этом дело...
хотя я не уверен, сейчас посмотрю.

п.с. а вообще зачем хранить указатели на методы? не проще ли хранить указатели на объекты, по которым и вызывать print()?

31K
31 июля 2010 года
deadok
16 / / 15.01.2008
Цитата:
п.с. а вообще зачем хранить указатели на методы? не проще ли хранить указатели на объекты, по которым и вызывать print()?


да. раньше у меня так и было. просто хотелось именно через методы класса. большое спасибо Norgat. остановлюсь на векторе из указателей на классы. надоело извращаться...

2.1K
31 июля 2010 года
Norgat
452 / / 12.08.2009
 
Код:
void figure::draw(void) {
    static std::vector<figure*> count;

    if(inited == false) {
        count.push_back(const_cast<figure*>(this));
    }

    count[0]->print();
}


примерно так можно сделать.

с указателями на методы что именно не так я не знаю(попробую разобраться как время будет), но подозреваю что всё дело именно в указателе на объект, который вызывает метод print()
31K
31 июля 2010 года
deadok
16 / / 15.01.2008
а можно вот так:
 
Код:
void figure::draw(void) {
    static std::vector<figure*> count;

    if(inited == false) {
        count.push_back(this);
    }

    count[0]->print();
}

:D
Цитата:
с указателями на методы что именно не так я не знаю(попробую разобраться как время будет), но подозреваю что всё дело именно в указателе на объект, который вызывает метод print()


кстати да. когда баловался с этими this и указ-ми ось ваще упала. стоит лишь написать вот так:

Код:
void figure::print(void) {
     static std::vector<void (figure::*)(void)> print_vector;
     static bool block = false;
     if(!block) {
            print_vector.push_back(&figure::print);
            block = true;
     }
     std::cout << id << std::endl; // вывод id
     (this->*print_vector[0])();
}


void figure::draw(void) {
     static std::vector<void (figure::*)(void)> print_vector;

      if(!inited) {
          print_vector.push_back(&figure::print); // записали адрес print в print_vector
          inited = true;
     }

     // вызов элемента print_vector
     (this->*print_vector[0])();
}

ну последствия вполне предсказуемы... :D
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог