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. как?
Код:
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;
}
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 не ругается. работу не тестировал.
то, что нужно. спасибо.
возник попутный вопрос. как теперь нужно вызвать указатель pFunc чтобы он выполнил те же действия, что и square?
Цитата: 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)();
}
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)();
}
большое спасибо
итак, имеется класс...
Код:
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])();
}
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();
}
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
Код:
1
1
1
1
1
но вместо этого выводятся square.id, circle.id, triangle.id
Код:
1
2
3
2
3
при этом, если бы было написано так
Код:
(this->*print_vector[1])();
Код:
(this->*print_vector[2])();
Код:
1
2
3
2
3
ПОЧЕМУ?! ведь поидее
Код:
(this->*print_vector[0])();
Цитата:
ПОЧЕМУ?! ведь поидее
Код:
(this->*print_vector[0])();
предполагает вызов функции print именно фигуры square, а не circle или triangle. моей главной целью является фиксация функции print всех figure и вызов их по мере надобности. как быть? надеюсь написал не слишком запутано
Код:
(this->*print_vector[0])();
предполагает вызов функции print именно фигуры square, а не circle или triangle. моей главной целью является фиксация функции print всех figure и вызов их по мере надобности. как быть? надеюсь написал не слишком запутано
ммм... дело в том, что каждому не статическому методу класса, при его вызове, неявно передаётся указатель на экземпляр класса. возможно в этом дело...
хотя я не уверен, сейчас посмотрю.
п.с. а вообще зачем хранить указатели на методы? не проще ли хранить указатели на объекты, по которым и вызывать print()?
Цитата:
п.с. а вообще зачем хранить указатели на методы? не проще ли хранить указатели на объекты, по которым и вызывать print()?
да. раньше у меня так и было. просто хотелось именно через методы класса. большое спасибо Norgat. остановлюсь на векторе из указателей на классы. надоело извращаться...
Код:
void figure::draw(void) {
static std::vector<figure*> count;
if(inited == false) {
count.push_back(const_cast<figure*>(this));
}
count[0]->print();
}
static std::vector<figure*> count;
if(inited == false) {
count.push_back(const_cast<figure*>(this));
}
count[0]->print();
}
примерно так можно сделать.
с указателями на методы что именно не так я не знаю(попробую разобраться как время будет), но подозреваю что всё дело именно в указателе на объект, который вызывает метод print()
Код:
void figure::draw(void) {
static std::vector<figure*> count;
if(inited == false) {
count.push_back(this);
}
count[0]->print();
}
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])();
}
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