Originariamente inviata da
MItaly
Sì, ma se inizi ad avere oggetti tenuti dentro per puntatore devi pensare ad una semantica di copia sensata, o quantomeno disabilitare costruttore di copia e operatore di assegnamento, altrimenti con il costruttore di copie di default ti ritrovi più ObjectB che puntano allo stesso a1 e cercano tutti di distruggerlo alla loro distruzione (con risultati catastrofici).
In generale, se possibile è più semplice avere membri "veri" e non puntatori a roba allocata sull'heap.
Suppongo che quello che hai appena spiegato possa accadere in una situazione del genere se non ho capito male:
ObjectA
codice:
#ifndef OBJECTA_H
#define OBJECTA_H
class ObjectA
{
public:
int y;
ObjectA();
~ObjectA();
};
#endif // OBJECTA_H
ObjectA.cpp
codice:
#include <iostream>
#include "ObjectA.h"
ObjectA::ObjectA()
{
y = 10;
std::cout << "Costruttore A " << std::endl;
}
ObjectA::~ObjectA()
{
}
ObjectV
codice:
#ifndef OBJECTV_H
#define OBJECTV_H
#include "ObjectA.h"
class ObjectV
{
public:
int x;
ObjectV();
~ObjectV();
ObjectA* getObjA();
private:
ObjectA* a1;
};
#endif // OBJECTV_H
ObjectV.cpp
codice:
#include <iostream>
#include "ObjectV.h"
ObjectV::ObjectV()
{
std::cout << "Costruttore V " << std::endl;
a1 = new ObjectA();
}
ObjectV::~ObjectV()
{
delete a1;
}
ObjectA* ObjectV::getObjA() {
return a1;
}
main
codice:
#include <iostream>
#include "ObjectA.h"
#include "ObjectV.h"
int main (void) {
ObjectV v1;
ObjectV v2 = v1;
ObjectA* av1 = v1.getObjA();
std::cout << "address a->y = " << av1->y << std::endl;
delete av1;
ObjectA* av2 = v2.getObjA();
std::cout << "address a->y = " << av2->y << std::endl; // in questo caso si av2 non esiste più poichè distrutto dalla delete di av1.
getchar();
return 0;
}
anche se un po estremizzata come situazione però il concetto penso è questo....