Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   ayuda con punteros en C++ (https://www.clubdelphi.com/foros/showthread.php?t=93867)

branncg 13-04-2019 18:31:23

ayuda con punteros en C++
 
Hola, resulta que tengo una funcion que une los valores de los conjuntos A y B, en un tercer conjunto llamado C, la union funciona bien,como ven estoy trabajando con punteros, ConjuntoPtr es una clase, A,B y C son los 3 objetos de la clase ConjuntoPtr, o los 3 conjuntos, aqui creo nuevos objetos a y b, pero al eliminar los elementos de a y b minusculas, se eliminan tambien de A y B mayusculas, yo solo quiero que se eliminen de a y b minusculas, no de los objetos principales A y B, alguna idea de como puedo hacerlo por favor, muchas gracias de antemano.
Código:

void Union( ConjuntoPtr *A,ConjuntoPtr *B,ConjuntoPtr *C){
        ConjuntoPtr *a=new ConjuntoPtr;
        a=A;
        ConjuntoPtr *b =new ConjuntoPtr;
        b=B;
        while(a->Cardinal()!= 0){
                int elem= a->Muestrea();
                C->Inserta(elem);
                a->Suprime(elem);

        }
                while(b->Cardinal()!= 0){
                int elem= b->Muestrea();
                C->Inserta(elem);
                b->Suprime(elem);


        }
       
}


escafandra 13-04-2019 22:38:09

Cuando trabajas con punteros debes tener una cosa bien clara, copiar un puntero no es copiar el elemento al que apunta. Por eso todo lo que hagas en a, ocurre en A porque ambos apuntan a la misma cosa.


Para que a y A apunten a objeto diferentes deberás crearlos y asignarlos. Si quieres que a tenga una copia del contenido de A, deberas realizarla. Si cu clase ConjuntoPtrtiene un constructor copia o definido un operados de asignación, podrás hacer la copia sin problemas pero de esta forma (que copia el valor y no el puntero):

Código:

ConjuntoPtr *a=new ConjuntoPtr;

*a = *A;


Recuerda que CPP permite trabajar con objetos de una clase que no son punteros:
Código:

ConjuntoPtr a = *A;


En el primer caso debes tener definido un operador asignación y en el segundo un constructor copia. Es buena costumbre tener ambos.


Saludos.

branncg 13-04-2019 23:40:06

muchas gracias por responder, ahora lo tengo mas claro, una duda mas, como defino un operador de asignacion o que te refieres con definir un operador asignacion?

escafandra 14-04-2019 01:32:57

Imagina esta clase muy simple que tiene
- Un Miembro
- Un constructor
- Un constructor Copia
- Un operador de asignación "="



Esta sería la definición:

Código:

class Clase
{
    public:
    int  Miembro;

  Clase();
    Clase(const Clase&);
    Clase &operator=(const Clase&);
};

// Constructor
Clase::Clase(): Miembro(0)
{
}


// Constructor copia

Clase::Clase(const Clase& c): Miembro(0)
{
  *this = c;
}



// Operador asignaión

Clase& Clase::operator=(const Clase &c)
{
    Miembro = c.Miembro;
    return *this;
}


Ahora un ejemplo de copia:
Código:

  // Objeto de la primera clase
  Clase C1;
  C1.Miembro = 1;

  Clase C2 = C1;  // Usando el constructor copia

  Clase C3;
  C3 = C1;        // Usando el operador asignación

  // Usando un puntero a una clase
  Clase *C4 = new Clase;  // La creo
  *C4 = C1;              // Copio el valor




Saludos.


La franja horaria es GMT +2. Ahora son las 01:05:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi