Forum: PC-Programmierung Objectdefinition über zwei Klassen


von Michael S. (michaelsmith)


Lesenswert?

Hallo,
ich verstehe nicht ganz den Code unten drunter.

1. wie wird der Parameter (Entity* ptr) den ScopedPtr Constructor 
übergeben ?
2. Warum kann ich das Objekt e über die Entity Klasse erstellen, muss 
ich hier nicht vererben (also class ScopedPtr : public Entity)?
1
class Entity
2
{
3
public:
4
Entity(){/* bla bla... */}
5
~Entity(){/* bla bla... */}
6
};
7
class ScopedPtr
8
{
9
private:
10
Entity* m_ptr;
11
public:
12
ScopedPtr(Entity* ptr) : m_ptr(ptr){}
13
~ScopedPtr(){delete m_ptr;}
14
};
15
int main()
16
{
17
{
18
ScopedPtr e = new Entity():
19
}
20
return 0;
21
}

VG

von Harald K. (kirnbichler)


Lesenswert?

Michael S. schrieb:
> 2. Warum kann ich das Objekt e über die Entity Klasse erstellen, muss
> ich hier nicht vererben (also class ScopedPtr : public Entity)?

Wieso sollte man das? Dein "ScopedPtr" enthält als Membervariable nur 
'nen Pointer darauf.

von Rolf M. (rmagnus)


Lesenswert?

Michael S. schrieb:
> 1. wie wird der Parameter (Entity* ptr) den ScopedPtr Constructor
> übergeben ?

Einfach so, oder was meinst du mit "wie"?
Dein 'new Entity()' erzeugt einen Zeiger auf Entity, und dieser wird als 
Parameter 'ptr' an den ScopedPtr-Konstruktor übergeben.

> 2. Warum kann ich das Objekt e über die Entity Klasse erstellen, muss
> ich hier nicht vererben (also class ScopedPtr : public Entity)?

Nein. Du hast einen Konvertierkonstruktor von Entity*  nach ScopedPtr 
definiert, und der kommt hier zur Anwendung. Wenn du keine implizite 
Konvertierung willst, musst du den Konstruktor als 'explicit' 
definieren:
1
explicit ScopedPtr(Entity* ptr) : m_ptr(ptr){}

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Michael S. schrieb:
> muss ich hier nicht vererben

Nein, du musst auch nicht von 'int' vererben, wenn du eine 'int' 
Membervariable nutzt.

Michael S. schrieb:
> wie wird der Parameter (Entity* ptr) den ScopedPtr Constructor übergeben

https://en.cppreference.com/w/cpp/language/copy_assignment

Da es blöd ist, in ScopedPtr eine Entity zu verwenden, weil er auf die 
Art nur als ScopedPtr für den Typ Entity und davon abgeleitete taugt und 
fur jeden anderen Typ noch ein ScooedOthertypePtr definiert werden 
müsste, sollte ScopedPtr besser als template definiert werden, oder 
zumindest Typ Any benutzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.