pointeri

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
viorel2004ro
Membru
Membru
Posts: 67
Joined: 20 Mar 2008, 23:23

pointeri

Post by viorel2004ro » 21 Mar 2008, 11:02

Salut

1.Fie codul urmator:

Code: Select all

int** arr=0;
arr=new int*[10];
for(int i=0;i<4;i++)
arr[i]=new int[3];
//stergerea
for(i=0;i<4;i++)
delete[] arr[i];
delete[];
[
Si acest cod;

Code: Select all

class A{
A();
virtual void Draw()=0;
~A();
};
class B:public A
{
 B();
virtual void Draw() { printf("B");}
~B();
}
classC:public A
{
 C();
virtual void Draw() { printf("C");}
~C();
}

A** p=new A*[2];
p[0]=new B;
p[1]=new C;
As vrea sa am p[0]=new B[10];
Cum se face?



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

Re: pointeri

Post by Marius Bancila » 21 Mar 2008, 11:27

Did you try it? Did you get an error?
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

viorel2004ro
Membru
Membru
Posts: 67
Joined: 20 Mar 2008, 23:23

Re: pointeri

Post by viorel2004ro » 22 Mar 2008, 16:27

Am corectat codul.Versiunea finala este urmatoarea:

Code: Select all

// CPP.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#include<conio.h>
using namespace std;
class A{
public:
	A() {};
virtual void Draw()=0;
~A() {printf("Scot A ");}

};
class B:public A
{
public:
	B() {};
virtual void Draw() { printf("B ");}
~B() {printf("Scot B ");};
};
class C:public A
{
public:
	C() {};
virtual void Draw() { printf("C ");}
~C() {printf("Scot C ");};
};
int _tmain(int argc, _TCHAR* argv[])
{
	int** arr=0;
	arr=new int*[10];
	for(int i=0;i<4;i++)
	arr[i]=new int[3];
	//stergerea
	for(int i=0;i<4;i++)
	delete[] arr[i];
	delete[] arr;

	A*** p=new A**[2];
	for(int i=0;i<2;i++)
	{
		p[i]=new A*[3];
		for(int j=0;j<3;j++)
			if(j%2==0)
				p[i][j]=new B();
			else
				p[i][j]=new C();
	}
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<3;j++)
				p[i][j]->Draw();
		printf("\n");
	}
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<3;j++)
			delete p[i][j];
		delete[] p[i];
	}
	delete[] p;
	_getch();
	return 0;
}
As dori sa-mi spuneti daca e corect cum am procedat?

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

Re: pointeri

Post by Marius Bancila » 23 Mar 2008, 22:37

Marius Bancila wrote:Did you try it? Did you get an error?
Mda, se pare ca am confundat forumul. ;) Am uitat ca aici se vorbeste romaneste.

Vezi ca atunci cand ai o ieharhie de clase, cea care e la baza, trebuie sa aiba destructorul virtual. Altfel risti ca obiectele sa nu fie distruse corect.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

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

Re: pointeri

Post by Silviu Ardelean » 24 Mar 2008, 00:33

Marius Bancila wrote: Vezi ca atunci cand ai o ieharhie de clase, cea care e la baza, trebuie sa aiba destructorul virtual. Altfel risti ca obiectele sa nu fie distruse corect.
Intr-adevar, fara "virtual" pe destructorii derivati, daca pui in ei break-points, vei vedea ca acele obiecte nu ti se distrug.
Acum, uitandu-ma si eu peste codul tau, incerc sa aflu de fapt ce vrei tu sa lamuresti din acest exemplu. Operatiile cu pointeri la pointeri la pointeri si/sau utilizarea lor cu o ierarhie de date?
Sincer, pana acum nu am vazut un caz real in care sa fi fost nevoit sa folosesc astfel de pointeri in combinatie cu o ierarhie de clase. :lol:

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

Re: pointeri

Post by Marius Bancila » 24 Mar 2008, 00:40

Silviu Ardelean wrote:
Marius Bancila wrote: Vezi ca atunci cand ai o ieharhie de clase, cea care e la baza, trebuie sa aiba destructorul virtual. Altfel risti ca obiectele sa nu fie distruse corect.
Intr-adevar, fara "virtual" pe destructorii derivati, daca pui in ei break-points, vei vedea ca acele obiecte nu ti se distrug.
Ma rog, pe aia derivati, virtual e facultativ atata timp cat e pe cel din clasa de baza. Acolo e problema de fapt.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

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

Re: pointeri

Post by Silviu Ardelean » 24 Mar 2008, 00:42

Marius Bancila wrote:
Silviu Ardelean wrote:
Marius Bancila wrote: Vezi ca atunci cand ai o ieharhie de clase, cea care e la baza, trebuie sa aiba destructorul virtual. Altfel risti ca obiectele sa nu fie distruse corect.
Intr-adevar, fara "virtual" pe destructorii derivati, daca pui in ei break-points, vei vedea ca acele obiecte nu ti se distrug.
Ma rog, pe aia derivati, virtual e facultativ atata timp cat e pe cel din clasa de baza. Acolo e problema de fapt.
Yeap! I agree. ;) Aceeasi idee privind utilizarea cuvantului cheie "virtual" e valabila si cand aveam de-a face cu polimorfismul.
Oricum, astept cu interes sa ne lamureasca Virel la ce s-a gandit el cu acei pointeri. :twisted:

viorel2004ro
Membru
Membru
Posts: 67
Joined: 20 Mar 2008, 23:23

Re: pointeri

Post by viorel2004ro » 24 Mar 2008, 07:41

Code: Select all

    // CPP.cpp : Defines the entry point for the console application.
    //

    #include "stdafx.h"
    #include<iostream>
    #include<conio.h>
    using namespace std;
    class A{
    public:
       A() {};
    virtual void Draw()=0;
virtual  ~A() {printf("Scot A ");}

    };
    class B:public A
    {
    public:
       B() {};
    virtual void Draw() { printf("B ");}
virtual  ~B() {printf("Scot B ");};
    };
    class C:public A
    {
    public:
       C() {};
    virtual void Draw() { printf("C ");}
   virtual  ~C() {printf("Scot C ");};
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
       int** arr=0;
       arr=new int*[10];
       for(int i=0;i<4;i++)
       arr[i]=new int[3];
       //stergerea
       for(int i=0;i<4;i++)
       delete[] arr[i];
       delete[] arr;

       A*** p=new A**[2];
       for(int i=0;i<2;i++)
       {
          p[i]=new A*[3];
          for(int j=0;j<3;j++)
             if(j%2==0)
                p[i][j]=new B();
             else
                p[i][j]=new C();
       }
       for(int i=0;i<2;i++)
       {
          for(int j=0;j<3;j++)
                p[i][j]->Draw();
          printf("\n");
       }
       for(int i=0;i<2;i++)
       {
          for(int j=0;j<3;j++)
             delete p[i][j];
          delete[] p[i];
       }
       delete[] p;
       _getch();
       return 0;
    }
L-am corectat dupa indicatiile voastre.Ideea era ilustrarea polimorfismului pe o matrice de obiecte si nu vector,
pornind de la o clasa abstracta.As dori sa stiu daca exista si implementari mai bune.

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

Re: pointeri

Post by Silviu Ardelean » 24 Mar 2008, 09:37

viorel2004ro wrote:L-am corectat dupa indicatiile voastre.Ideea era ilustrarea polimorfismului pe o matrice de obiecte si nu vector,
pornind de la o clasa abstracta.As dori sa stiu daca exista si implementari mai bune.
Dupa cum ziceam eu si Marius, atat la destructori cat si la metode virtuale e suficient si indicat sa pui "virtual" doar pe destructorul si metodele "polimorfice" ale clasei de baza. Deci, potzi scoate virtual din clasele B si C.
Stiam si eu ca de fapt tu ai simulat o matrice 3D de obiecte, numai ca eu te intrebam de un context real, intr-o aplicatie reala. Sincer, in acest moment nu-mi vine in minte nici un exemplu unde as putea utiliza o astfel de combinatie. Poate daca ai mai avea o clasa D derivata din A si elementele matricii ar fi de fapt, instante ale claselor B, C, D.
Deci, rugamintea mea e, daca se poate sa ne dai un exemplu concret unde ai fi nevoit sa folosesti o astfel de implementare.

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

Re: pointeri

Post by Marius Bancila » 24 Mar 2008, 10:27

Se mai poate si altfel, daca te risti: cu placement new.
http://www.parashift.com/c++-faq-lite/d ... #faq-11.10

Uite aici niste cod pentru asa ceva:

Code: Select all

class A{
public:
   A() {printf("constructing A \n");}
   virtual void Draw()=0;
   virtual ~A() {printf("desctucting A \n");}
};

class B:public A
{
public:
   B() {printf("constructing B \n");}
   virtual void Draw() { printf("B \n");}
   virtual ~B() {printf("desctucting B \n");};
};

class C:public A
{
public:
   C() {printf("constructing C \n");}
   virtual void Draw() { printf("C \n");}
   virtual  ~C() {printf("desctucting C \n");};
};


int _tmain(int argc, _TCHAR* argv[])
{
   char** arr = new char*[2];
   for(int i = 0; i < 2; ++i)
   {
      arr[i] = new char[2*sizeof(B)];
      
      for(int j = 0; j < 2; ++j)
      {
         void* place = &arr[i][0] + j*sizeof(B);
         A* a = new(place)B();
      }
   }

   for(int i = 0; i < 2; i++)
   {
      for(int j = 0; j < 2; ++j)
      {
         void* place = &arr[i][0] + j*sizeof(B);
         ((A*)place)->~A();
      }

      delete [] arr[i];
   }

   delete [] arr;

	return 0;
}
Eu unul nu m-as risca sa fac asa ceva intr-o aplicatie. Chestia asta devine complicata in momentul in care trebuie sa lucrezi cu o ierarhie intreaga de clase. Iti las tie ca exercitiu sa instantiezi si obiecte de tip C.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

Post Reply