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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2010, 10:56   #1
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию Передача метода объекта.

Можно передавать в методы и функции объекты и функции. А каким образом можно передать метод объекта? Пробовал сделать что-то вроде
fdelegat(&any.tails()); и fdelegat(&any.tails); но не прокатывает.

Код:
#include<iostream>
using namespace std;

class Any {
public:
    void tails() {
        cout<<"tails execute"<<endl;
    }
};

void anyfunc() {
        cout<<"func execute"<<endl;
}

// приём объекта
void delegat(void *pt2Object) {
    Any* temp4Obj = (Any*)pt2Object;
    temp4Obj->tails();
}
//приём функции
void fdelegat(void (*pt2func)()) {
    pt2func();
}
int main() {
    Any any;
    delegat(&any);
  //  fdelegat(&any.tails());
return 0;
}
the_deer_one вне форума Ответить с цитированием
Старый 09.09.2010, 11:06   #2
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Мож лучше делать через механизм наследования и виртуальных методов ? Он вообще для этого и придуман
blob вне форума Ответить с цитированием
Старый 09.09.2010, 11:29   #3
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

blob
Цитата:
Мож лучше делать через механизм наследования и виртуальных методов ? Он вообще для этого и придуман
Проиллюстрируй.
the_deer_one вне форума Ответить с цитированием
Старый 09.09.2010, 12:15   #4
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Код:
class MyParent
{
...
   virtual void tails(){}
...
}
class Any1: public MyParent
{
   void tails(){cout<<"Any1 tails execute"<<endl;}
}
class Any2: public MyParent
{
   void tails(){cout<<"Any2 tails execute"<<endl;}
}

int main() {
    MyParent* any;
    if(bCase) any=new Any1();
    else any=new Any2();
    any->tails();
return 0;
}
То есть зависит от условия, какой объект вызывает свой собственный tails
blob вне форума Ответить с цитированием
Старый 09.09.2010, 12:28   #5
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

blob
Гм. Неее, это что-то не то, я даже вообще не очень понял зачем мне такое может понадобиться.

Мне нужно сцеплять методы разных объектов с различными "хвостами" одного класа.
Вот функцию можно свободно передавать в качестве параметра. Но мне не функции нужны а методы, с++ всё же ооп. Логично предполагать, что уж методы то там можно передавать на манер функций.
the_deer_one вне форума Ответить с цитированием
Старый 09.09.2010, 12:38   #6
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

У тебя есть(точнее нужен) один родитель для всех классов, у которых меняется хвост. В функцию нужно передавать не метод, а класс конечный, чтобы срабатывала виртуальная функция. Что ты подразумеваешь под "сцеплять" ? Одна из фишек ооп - полиморфизм , и , судя по твоему коду, ты именно его пытаешься изобрести.
blob вне форума Ответить с цитированием
Старый 09.09.2010, 12:52   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

Код:
#include<iostream>

using namespace std;

class Any {
public:
    void tails1()
	{
        cout<<"tails1 execute"<<endl;
    }

    void tails2()
	{
        cout<<"tails2 execute"<<endl;
    }

    void tails3()
	{
        cout<<"tails3 execute"<<endl;
    }
};

void anyfunc()
{
	cout<<"func execute"<<endl;
}

//приём функции
void fdelegat(Any *obj, void (Any::*pFoo)())
{
	(obj->*pFoo)();
}

int main()
{
    Any any;
	fdelegat(&any, &Any::tails1);
	fdelegat(&any, &Any::tails2);
	fdelegat(&any, &Any::tails3);
	return 0;
}
правильно тебе сказали, используй виртуальные функции через базовый класс
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 09.09.2010, 13:18   #8
Chris D
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 31
По умолчанию

Код:
class sData {
private:
		int sX;
		int sY;
public:
		sData (int iFirstItem, int iSecondItem) : sX(iFirstItem), sY;(iSecondItem) {}
		void sReturn() {
			cout << "X is: " << sX;
			cout << "Y is: " << sY;
		}
		void sReplace(int &FirstItem, int &SecondItem) {
				int TEMP		=	FirstItem;
				FirstItem		=	SecondItem;
				SecondItem		=	TEMP;
		}
			
};
void sShow(sData cCall, void (sData::*sPointer)()) {
	(cCall.*sPointer) ();
}
void sCallReplaceFunction(sData *cObjReplace, int sGetOne, int sGetTwo, void(sData::*sReplacePointer)(int &, int &)) {
	(cObjReplace->*sReplacePointer) (sGetOne, sGetTwo);
}
int main() 
{
	int sDataOne = 10;
	int sDataTwo = 20;

	sData cCallObj(10, 20);
	
	sShow(cCallObj, &sData::sReturn);	
	sCallReplaceFunction(cCallObj, &sData::sReplace) (sDataOne, sDataTwo);
	
	return 0;
}
Как вариант. Заранее прошу прощения за ошибку в логике, писал прямо здесь на скорую руку...
Я так понял что это и было нужно..
Chris D вне форума Ответить с цитированием
Старый 09.09.2010, 15:07   #9
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Chris D
Цитата:
Я так понял что это и было нужно..
Ага. Примерно так. Только как-то оно жутко выглядит.

Код:
#include<iostream>
using namespace std;

class Any {
public:
    void tails() {
        cout<<"tails execute"<<endl;
    }
};

void mdeleg(void *pt2Object,void (Any::*ptm)()) {
    Any* temp4Obj = (Any*)pt2Object; 
    (temp4Obj->*ptm)();   
}


int main() {
    Any any;

    mdeleg(&any,&Any::tails);
return 0;
}
the_deer_one вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача метода класса в CreateThread mike_tihomirov Win Api 3 17.07.2010 14:13
Передача имени объекта в процедуру (Потоки) Delphi edmynt Помощь студентам 3 03.02.2010 20:58
Передача объекта в функцию Юра_YUYU Общие вопросы C/C++ 14 18.01.2010 16:00
COM-объекты в MS Script Control. Присвоение метода одного объекта другому объекту. Антон Ю.Б. Общие вопросы Delphi 1 04.04.2009 13:41
Передача метода класса в качестве параметра в другой метод Dmytry87 Общие вопросы C/C++ 0 12.11.2008 15:28