apel functie dinamic

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
viorel2005
Membru
Membru
Posts: 208
Joined: 24 May 2008, 09:41

apel functie dinamic

Post by viorel2005 » 12 Sep 2011, 10:35

Salut!

Fie urmatorul cod:

Code: Select all

#include "stdafx.h"
#include<conio.h>
 class Msg {
 public:
   void f(char* msg)
   {
	   printf("%s\n",msg);
   }
 };
 
 template<class T>
 class TstMsg{
 public:
	  void TMsg(char* msg)
	  {
		  T obj;
		  obj.f(msg);
	  }
 };
 
 
int _tmain(int argc, _TCHAR* argv[])
{
	TstMsg<Msg> t;
	t.TMsg("ion");
	_getch();

	return 0;
}

As dori ca functia TMsg sa poata apela dinamic metoda f daca as transmite un pointer la functia membra f a clasei Msg:

Code: Select all

#include "stdafx.h"
#include<conio.h>
 class Msg {
 public:
   void f(char* msg)
   {
	   printf("%s\n",msg);
   }
 };


 template<class T>
 class TstMsg{
T Msg;
 public:
       void TMsg(T msg,T2* obj); 
 };
 
 
int _tmain(int argc, _TCHAR* argv[])
{
	TstMsg<char*> t;
     
	t.TMsg("hello",&Msg ::f());
	_getch();

	return 0;
}

Cum as putea sa am un T2 dinamic?



User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: apel functie dinamic

Post by Silviu Ardelean » 12 Sep 2011, 11:17

viorel2005 wrote:As dori ca functia TMsg sa poata apela dinamic metoda f daca as transmite un pointer la functia membra f a clasei Msg:
Cat de "dinamic" e acest apel?
La ce iti mai trebuie acest pointer daca ai deja instanta de tip T in metoda ta?

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: apel functie dinamic

Post by cristianamarie » 12 Sep 2011, 13:13

Code: Select all

class Msg {
public:
   void f(char* msg)
   {
      printf("%s\n",msg);
   }
};

template<class T>
class TstMsg{
public:
     void TMsg(char* msg, void (T::* pfn)(char*))
     {
        T obj;
        (&(obj)->*pfn)(msg);
     }
};


int _tmain(int argc, _TCHAR* argv[])
{
   TstMsg<Msg> t;
   t.TMsg("ion", &Msg::f);
   _getch();

   return 0;
}
Bun asa ?
Nuclear launch detected

viorel2005
Membru
Membru
Posts: 208
Joined: 24 May 2008, 09:41

Re: apel functie dinamic

Post by viorel2005 » 12 Sep 2011, 14:59

Multumesc pentru raspuns. As dori facilitatea urmatoare:

Code: Select all

class Msg {
public:
   void f(char* msg)
   {
      printf("%s\n",msg);
   }
};

class MsgError {
public:
   void f(char* msg)
   {
      printf("Error: %s\n",msg);
   }
};

template<class T>
class TstMsg{
public:
       void TMsg(T msg,T2* obj);
};


int _tmain(int argc, _TCHAR* argv[])
{
   TstMsg<char*> t;
   int a,b;
   a=3; b=7;
   if a==b
        t.TMsg("Sunt egale", &Msg::f);
   else
       t.TMsg("Nu Sunt egale", &MsgError::f);
      _getch();

   return 0;
}
Last edited by viorel2005 on 12 Sep 2011, 20:22, edited 1 time in total.

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: apel functie dinamic

Post by cristianamarie » 12 Sep 2011, 17:53

Ce inseamna modificarea
TstMsg<char> t;
? In primul exemplu era
TstMsg<Msg> t;
Nuclear launch detected

viorel2005
Membru
Membru
Posts: 208
Joined: 24 May 2008, 09:41

Re: apel functie dinamic

Post by viorel2005 » 12 Sep 2011, 20:47

Doresc ca intr-o clasa sa apelez o alta functie membra a altei clase, fara sa ma intereseze din ce clasa face parte functia respectiva.
Ceva de genul:

Code: Select all

class Aduna
{
  public:
     int Suma(int a, int b) {return a+b};
};
class Difer
{
  public:
     int Scad(int a, int b) {return a-b};
};

//clasa Apelare nu stie ca sunt clasele de mai sus definite
class  Apelare{
public:
int   Apel(int a,int b,..../*inca un termen*/)
{
         
          return  /* rezultatul apelarii functie transmisa ca parametru cu parametrii a si b/;
 
}
};

void main()
{
   Apelare a;
   int a=2,b=4;
   int Rez1=A.Apel(a,b,&Aduna::Suma);
   int Rez2=A.Apel(a,b,&Aduna::Scad);
   
}

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: apel functie dinamic

Post by Viorel » 12 Sep 2011, 21:37

Încearcă următoarea variantă:

Code: Select all

class Apelare
{
public:
    template< typename R, typename T, typename A1, typename A2 >
    R Apel(A1 a, A2 b, R (T::*f)(A1, A2))
    {
        return (T().*f)(a, b);
    }
 
    template< typename R, typename A1, typename A2 >
    R Apel(A1 a, A2 b, R (*f)(A1, A2))
    {
        return f(a, b);
    }
};
Exemplu utilizare:

Code: Select all

Apelare A;
int a=2, b=4;
int Rez1 = A.Apel(a, b, &Aduna::Suma);
int Rez2 = A.Apel(a, b, &Difer::Scad);
int Rez3 = A.Apel(a, b, &Aduna::FunctieStatica);
int Rez4 = A.Apel(a, b, &FunctieNemembra);

viorel2005
Membru
Membru
Posts: 208
Joined: 24 May 2008, 09:41

Re: apel functie dinamic

Post by viorel2005 » 12 Sep 2011, 22:10

Multumesc mult!Merge foarte bine. Codul este urmatorul:

Code: Select all

#include "stdafx.h"
#include<conio.h>
class Aduna
{
  public:
     int Suma(int a, int b) 
	 {
		 return a+b;
	 }
	 static int StaticSuma(int a, int b) 
	 {
	    return a+b;
	 }
	 
};
class Difer
{
  public:
     int Scad(int a, int b) 
	 {
		 return a-b;
	 }
};
int NonSuma(int a, int b) 
{
	return a+b;
};
class Apelare
{
public:
    template< typename R, typename T, typename A1, typename A2 >
    R Apel(A1 a, A2 b, R (T::*f)(A1, A2))
    {
        return (T().*f)(a, b);
    }

    template< typename R, typename A1, typename A2 >
    R Apel(A1 a, A2 b, R (*f)(A1, A2))
    {
        return f(a, b);
    }

};

void ScrieRez()
{
        Apelare A;
  	int a=3, b=5;
        int Rez1 = A.Apel(a, b, &Aduna::Suma);
        int Rez2 = A.Apel(a, b, &Difer::Scad);
        int Rez3 = A.Apel(a, b, &Aduna::StaticSuma);
	int Rez4 = A.Apel(a, b, &NonSuma);
	printf("Rez1=%d Rez2=%d Rez3=%d Rez4=%d\n",Rez1,Rez2,Rez3,Rez4);
	 _getch();
}
int _tmain(int argc, _TCHAR* argv[])
{
	Apelare A;
        ScrieRez();
	return 0;
}




User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: apel functie dinamic

Post by cristianamarie » 13 Sep 2011, 11:49

Nu prea inteleg de ce metodele alea nu sint statice. Solutia e ok, dar instantiaza niste clase care au metode gen

Code: Select all

class Aduna {
public:
  int Add(int a, int b) { return a + b; }
};
Daca metoda ar fi statica (sau nici macar intr-o clasa) ai putea sa pasezi direct pointerul la functie stiind doar prototipul. My 0.02.
Nuclear launch detected

viorel2005
Membru
Membru
Posts: 208
Joined: 24 May 2008, 09:41

Re: apel functie dinamic

Post by viorel2005 » 14 Sep 2011, 09:39

Am modificat solutia lui viorel.Un cod mai simplu ar fi asa:

Code: Select all

#include "stdafx.h"
#include<conio.h>
#include<iostream>
using namespace std;
// TestPtrFunc.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<conio.h>
#include<iostream>
using namespace std;
 float Suma(float a,float b)
 {
	 return a+b;
 }
 float Scad(float a,float b)
 {
	 return a+b;
 }
 
 class A
 {

 public:
	 float Suma(float a,float b)
 {
	 return a-b;
 }
 };

 class B
 {

 public:
	 float Scad(float a,float b)
 {
	 return a-b;
 }
 };

 class C
 {
 public:
	 template< typename T  >
    void Apel(float a, float b, float (T::*f)(float, float))
    {
		cout << "Din clasa:"<< (T().*f)(a, b)<<endl;;

    }

	void Apel(float a, float b, float (*pt2Func)(float, float))
	{
      cout << "Din clasa:"<<pt2Func(a,b) << endl;
	}
 };

template< typename T  >
    void Apel(float a, float b, float (T::*f)(float, float))
    {
           cout<< (T().*f)(a, b)<<endl;

    }

 void Apel(float a, float b, float (*pt2Func)(float, float))
{
      cout << pt2Func(a,b) << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	Apel(2,3,&Suma);
	Apel(2,3,&A::Suma);
	Apel(2,3,&Scad);
	Apel(2,3,&B::Scad);
	C c;
	c.Apel(2,3,&Suma);
	c.Apel(2,3,&A::Suma);
	c.Apel(2,3,&Scad);
	c.Apel(2,3,&B::Scad);
	
	_getch();

	return 0;
}


Intrebarea este daca as putea scapa de template folosind pointeri void*. Exista vreo solutie?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: apel functie dinamic

Post by Ovidiu Cucu » 14 Sep 2011, 11:13

viorel2005 wrote: Intrebarea este daca as putea scapa de template folosind pointeri void*. Exista vreo solutie?
Si care-ar fi scopul final? Intoarcerea la C-chior ?

Post Reply