Objectdefinition über zwei Klassen

OP #7464831
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

#7464933
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.

  1. 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){}
#7464967
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren