Page 1 of 1

pointeri

Posted: 21 Mar 2008, 11:02
by viorel2004ro
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?

Re: pointeri

Posted: 21 Mar 2008, 11:27
by Marius Bancila
Did you try it? Did you get an error?

Re: pointeri

Posted: 22 Mar 2008, 16:27
by viorel2004ro
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?

Re: pointeri

Posted: 23 Mar 2008, 22:37
by Marius Bancila
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.

Re: pointeri

Posted: 24 Mar 2008, 00:33
by Silviu Ardelean
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:

Re: pointeri

Posted: 24 Mar 2008, 00:40
by Marius Bancila
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.

Re: pointeri

Posted: 24 Mar 2008, 00:42
by Silviu Ardelean
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:

Re: pointeri

Posted: 24 Mar 2008, 07:41
by viorel2004ro

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.

Re: pointeri

Posted: 24 Mar 2008, 09:37
by Silviu Ardelean
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.

Re: pointeri

Posted: 24 Mar 2008, 10:27
by Marius Bancila
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.