functii virtuale

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

functii virtuale

Post by viorel2005 » 28 Nov 2012, 21:35

Salut!

Code: Select all

#include "stdafx.h"

#include<iostream.h>

class Baza{
public:

	virtual void New()
	{
				
	}
	virtual void Hello() 
	{
			cout<<"hello baza"<<endl;
	}
};

class Mainframe{
public:
	Mainframe()
	{
	}
	void Build()
	{
		cout<<"build ok!"<<endl;
	}
	void ChangeBaza(Baza* pBaza)
	{
		m_Baza = pBaza;
	}


	void CallBaza()
	{
		m_Baza->Hello();
		
	}
	Baza *m_Baza;

};


class Test
{
public:
	
	void Build()
	{
		pm=new Mainframe();
		

	}
	Mainframe* Get() 
	{
		return pm; 
	}
	virtual ~Test() {}
private:
	Mainframe* pm;
};


Test t;


class D1:public Baza
{
public:
	D1()	{}
	virtual ~D1()	{}
	virtual void Hello() 
	{
			cout<<"hello D1"<<endl;
	}

};


class D2:public D1
{

public:
	D2()	{}
	virtual void Hello() 
	{
			cout<<"hello D2"<<endl;
	}

	virtual ~D2() { }

};

class D3:public D1
{
public:
	D3()	{}
	virtual ~D3() { }

	void Click()
	{
		t.Get()->ChangeBaza(this);
	}
	
};





class D4:public D3
{
public:
	D4()	{}
	virtual ~D4() { }
	virtual void New()
	{
				cout<<"new"<<endl;
	}

	virtual void Hello() 
	{
			cout<<"hello D4"<<endl;
	}

	

};
int main(int argc, char* argv[])
{
	Test t;
	t.Build();	
	D3* d4=new D4();//sau D4* d4=new D4();
	t.Get()->ChangeBaza(d4);
	d4->Click();
	t.Get()->CallBaza();

	
	return 0;
}
Imi da eroare in visual c++ 6 la executie.
As dori sa afiseze: textul new din apelul functiei D4:New();

Multumesc anticipat.



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: functii virtuale

Post by Marius Bancila » 29 Nov 2012, 10:59

Nu stiu ce cod e asta, dar nu vad cum ar putea compila. Odata, cine e "t" in D3::Click. In al doilea rand, ce eroare ai. Sau ai impresia sa suntem ghicitori aici? Si de unde vrei sa ti se apeleze textul din D4::New, daca tu nu alezi functia New()?
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: functii virtuale

Post by zlatomir » 29 Nov 2012, 11:17

@Marius: E si un 't' e global, iar ca eroare eu pariez ai mei doi bani pe access violation.
@Viorel vezi ca ai doi 't' si numai pt unul apelezi Build() (care build iti initializeaza pointer-ul membru in clasa test - sau cum se cheama clasa a carei instanta e 't')
Si mai ai si un car de leak-uri si totusi de ce tot freci pointer-ii aia pe acolo? care e scopul, ce vrei defapt sa faci cu codul asta?

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

Re: functii virtuale

Post by Ovidiu Cucu » 29 Nov 2012, 12:06

Nu-i nevoie de acea architectura tip Scary Movie for Developers si nici macar nu ai nevoie de functii virtuale ca sa-l faci sa crape cu strigaturi, din aceeasi cauza. Uite un exemplu mai simplu.

Code: Select all

struct Foo
{
   int m;
};

class Test
{
   Foo* m_foo;
public:
   void Init()
   {
      m_foo = new Foo;
   }

   Foo* GetFoo() 
   {
      return m_foo;
   }
};

Test t; // global

class Bar
{
   Foo* m_foo;
public: 
   void Kaboom()
   {
      // use global t
      t.GetFoo()->m = 666; // Kaboom!!!
   }
};


int main()
{
   Test t; // local in main
   t.Init();
   Bar bar;
   bar.Kaboom();

   return 0;
}
Se vede usor unde-i buba. Am doua obiecte tip Test: unul global si celalalt local, in functia main.
Pentru cel local se apeleaza functia Test::Init, pentru cel global NU.
In functia Bar::Kaboom folosesc obiectul global de tip Test, cel neinitializat. Fiind global, Test::m_foo este by default NULL.
Mai departe e clar de ce crapa.

Acuma revenind la architectura: scoate darcului obiectul ala global si nu te mai juca cu focu!

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

Re: functii virtuale

Post by viorel2005 » 29 Nov 2012, 12:10

Code: Select all

#include "stdafx.h"
#include<iostream.h>

class Baza{
public:
   virtual void New()   {								 }
   virtual void Hello() {   cout<<"hello baza"<<endl;    }
};

class Mainframe{
public:
   Mainframe()  				 { 								}
   void Build()  				 {   cout<<"build ok!"<<endl;   }
   void ChangeBaza(Baza* pBaza)  {   m_Baza = pBaza;  			}
   void CallBaza() 				 {   m_Baza->Hello();		    }
   Baza *m_Baza;
};


class Test{
public:
   void Build() 				 {    pm=new Mainframe();      }
   Mainframe* Get() 			 {    return pm; 			   }
   virtual ~Test() {}
private:
   Mainframe* pm;
};

class D1:public Baza{
public:
   D1()  						 {								}
   virtual ~D1()   				 {								}
   virtual void Hello() 	     {     cout<<"hello D1"<<endl;  }
};

class D2:public D1{
public:
   D2()   						{								}
   virtual void Hello() 		{      cout<<"hello D2"<<endl;  }
   virtual ~D2() 				{								}
};

Test t;

class D3:public D1{
public:
   D3()   						{								}
   virtual ~D3() 				{								}
   void Click()					{   t.Get()->ChangeBaza(this);  }
};

class D4:public D3
{
public:
   D4()   						{								}
   virtual ~D4() 				{								}
   virtual void New()			{      cout<<"new"<<endl;		}
   virtual void Hello() 		{      cout<<"hello D4"<<endl;  }
};

int main(int argc, char* argv[])
{

   t.Build();   
   D3* d4=new D4();//sau D4* d4=new D4();
   t.Get()->ChangeBaza(d4);
   d4->Click();
   t.Get()->CallBaza();
  
   return 0;
}
L-am corectat.
Ideea este urmatoarea: cand lucrezi cu GTK in C este bine sa ai un obiect global si sa folosesti mecanismul functilor virtuale pentru evenimente.
Multumesc la toti pentru sfaturi.
Sper sa pot reproduce problema din GTK si gcc.

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

Re: functii virtuale

Post by viorel2005 » 29 Nov 2012, 12:26

Am rezolvat cred si problema din GTK. Era din cauza unor flag-uri.

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

Re: functii virtuale

Post by Ovidiu Cucu » 29 Nov 2012, 12:31

viorel2005 wrote:Am rezolvat cred si problema din GTK. Era din cauza unor flag-uri.
Al darcului flaguri care dau access violation... :biggrin:

Post Reply