2017-07-25 3 views
0

sagen, dass ich eine Klasse-Charakter haben, und ich habe:Einstellung geteilt PTRs auf null

shared_ptr<Character> c; 

als ein Feld in der Klasse A. Im Konstruktor von A, kann ich dies tun:

A::A(..):c{nullptr} 

Ist das gültig? Wie initialisiere ich ein freigegebenes PTR in MIL dann richtig?

+0

Wenn ich Ihre Frage richtig verstehe, müssen Sie nichts tun. – Borgleader

+2

Was ist 'MIL'? – user2079303

+0

Sie müssen sich bewusst sein, dass Klassentypen (im Gegensatz zu Basistypen) bereits implizit standardmäßig initialisiert sind, sodass Sie selbst nichts tun müssen. –

Antwort

1

Verwenden Sie einfach leere Klammern:

A::A() : 
c() 
{ 
} 

Dies wird die Instanz default initialise.

Oder verzichten Sie vollständig auf die Initialisierung.

A::A() = default oder löschen Sie den Konstruktor vollständig.

+1

Müssen Sie 'c' überhaupt erwähnen? – melpomene

+4

Wenn alle Member-Variablen standardkonstruiert/-initialisiert sein sollten, wird kein 'A'-Konstruktor benötigt. Oder verwenden Sie möglicherweise explizit den 'default'-Bezeichner dafür. –

4

Sie müssen c nicht einmal explizit auf nullptr setzen, obwohl Ihr Code gültig ist.

Here Sie können eine Liste der verfügbaren Konstruktoren sehen. Constructors:

constexpr shared_ptr() noexcept; 
constexpr shared_ptr(std::nullptr_t) noexcept; 

das gleiche tun:

Konstruiert ein shared_ptr ohne verwaltete Objekt, also leer Shared_ptr

so Standardinitialisierung von c ist ziemlich gut und sollte für Sie arbeiten auch.

3

Ist das gültig? Wie initialisiere ich ein freigegebenes PTR in MIL dann richtig?

Ja wie in documentation angegeben Initialisierung std::shared_ptr von nullptr ist prefectly gültig. Beachten Sie die Verwendung derselben Standardkonstruktors erreichen kann, aber wenn man auf diese Weise besser lesbar finden initialisiert es std::shared_ptr die gleiche Art und Weise:

1-2) Konstruiert ein shared_ptr ohne verwaltete Objekt, also leer Shared_ptr

2

PTRs gemeinsamen Einstellung

c{nullptr} 

Ist das gültig auf null?

Ja. Das wird den shared_ptr(std::nullptr_t) Konstruktor aufrufen.

Andere Möglichkeit ist Wert Initialisierung, die den Standardkonstruktor aufruft: c().

Oder haben Sie einfach keinen Eintrag in der Elementinitialisierungsliste.Mitglieder, die keinen Eintrag in der Mitgliederinitialisierungsliste haben und keinen Klammerinitialisierer haben, werden standardmäßig initialisiert. Standard initialisierte Klassenobjekte werden mit dem Standardkonstruktor initialisiert. Dann benötigen Sie keinen benutzerdefinierten Konstruktor. Der implizit generierte Standard initialisiert alle Mitglieder, was genau das ist, was Sie wollen.

Verwandte Themen