Perdón por el título largo pero quería ser específico. me espera el siguiente código para trabajar pero no y no puedo entender por qué:/¿Cómo es que un puntero a una clase derivada no se puede pasar a una función esperando una referencia a un puntero a la clase base?
#include <cstdio>
#include <cassert>
class UniquePointer
{
public:
void Dispose()
{
delete this;
}
friend void SafeDispose(UniquePointer*& p)
{
if (p != NULL)
{
p->Dispose();
p = NULL;
}
}
protected:
UniquePointer() { }
UniquePointer(const UniquePointer&) { }
virtual ~UniquePointer() { }
};
class Building : public UniquePointer
{
public:
Building()
: mType(0)
{}
void SetBuildingType(int type) { mType = type; }
int GetBuildingType() const { return mType; }
protected:
virtual ~Building() { }
int mType;
};
void Foo()
{
Building* b = new Building();
b->SetBuildingType(5);
int a = b->GetBuildingType();
SafeDispose(b); // error C2664: 'SafeDispose' : cannot convert parameter 1 from 'Building *' to 'UniquePointer *&'
b->Dispose();
}
int main(int argc, char* argv[])
{
Foo();
return 0;
}
Tenga en cuenta que no hay nada "seguro" sobre lo que está tratando de hacer. Si 'b' se establece en' NULL', entonces 'b-> Dispose();' causa un comportamiento que es tan indefinido como si 'b' apuntara a un objeto eliminado. –
@Charles: Editado, en espera de revisión. Este error no es parte de una pregunta, ¿verdad? –
Además, no es necesario que 'SafeDispose' sea un amigo, ya que 'Dispose' es público. –