Ich habe eine einfache Container-Klasse, die auf eine abstrakte Klasse zeigt und ich habe Funktionen, um den Zeiger in der Container-Klasse zu erhalten/setzen. Genauer gesagt, sieht die Klasse wie folgt:C++ Das abgeleitete Objekt der abstrakten Klasse in eine andere Klasse einfügen, ohne die Zeiger zu hängen?
class Container
{
Abstract* thing;
public:
void set(Abstract &obj)
{
thing = &obj; //danger of dangling pointer
}
Abstract* get()
{
return thing;
}
};
Abstract
eine abstrakte Klasse ist. Wie bereits zu sehen ist, besteht die Gefahr eines baumelnden Zeigers. Ich weiß, dass ich eine Kopie des Objekts (neu) machen und darauf zeigen könnte. Aber ich kann keine Instanz einer abstrakten Klasse erstellen. Welche Lösungen gibt es dafür?
Die folgenden sind nur weitere Informationen:
Klassendefinitionen
class Abstract
{
public:
virtual void something() = 0;
};
class Base : public Abstract
{
int a;
public:
Base() {}
Base(int a) : a(a){}
virtual void something()
{
cout << "Base" << endl;
}
};
class Derived : public Base
{
int b;
public:
Derived() {}
Derived(int a, int b) : Base(a), b(b){}
virtual void something()
{
cout << "Derived" << endl;
}
};
Einfache Tests
void setBase(Container &toSet)
{
Base base(15);
toSet.set(base);
}
void setDerived(Container &toSet)
{
Derived derived(10, 30);
toSet.set(derived);
}
int main()
{
Container co;
Base base(15);
Derived derived(10, 30);
Base *basePtr;
Derived *derivedPtr;
//This is fine
co.set(base);
basePtr = static_cast<Base *>(co.get());
basePtr->something();
//This is fine
co.set(derived);
derivedPtr = static_cast<Derived *>(co.get());
derivedPtr->something();
//Reset
basePtr = nullptr;
derivedPtr = nullptr;
//Dangling pointer!
setBase(co);
basePtr = static_cast<Base *>(co.get());
basePtr->something();
//Dangling pointer!
setDerived(co);
derivedPtr = static_cast<Derived *>(co.get());
derivedPtr->something();
return 0;
}
Möchten Sie den Grund des Downvotes teilen? – silentwf
Mögliches Duplikat von [Was ist ein intelligenter Zeiger und wann sollte ich einen verwenden?] (Http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use) -one) – LogicStuff
@silentwf Die Downvote-Gründe werden im Tooltip geteilt, wenn Sie die DV-Schaltfläche mit dem Mauszeiger bewegen. –