Frage

Ich bin gerade erst mit C ++ und bekam einige Probleme zu verstehen, wie der Umfang für private Membervariablen in einer Klasse funktioniert. Bitte beachten Sie den Code unten

class Foo{
    private:
        std::vector<int> container;
    public:
        // other methods
};

int main(int argc, char* argv[])
{
    Foo* foo = new Foo;
    // other method calls to which foo is passed
    delete foo;
    return 0;
}

In dem obigen Code, variable "Container" ist eine private Membervariable. Ich bin „Foo“ Instanz aufgerufen wird, und es zu mehreren anderen Methoden und Klassen übergeben. Im Folgenden sind meine Zweifel

  1. Was wird der Umfang der Variable „Container“ sein? Wird diese Variable existieren, bis ich die Instanz foo löschen?
  2. Muss ich den „Container“ als Zeiger machen Vektor?

Danke für die Hilfe

War es hilfreich?

Lösung

  1. Ja, die Lebensdauer des Behälterelements wird, solange das Objekt halten, dass es existiert enthält, die ist, bis Sie delete auf den Zeiger auf sie zeigen (foo in Ihrem Fall) nennen.
  2. Nein, es gibt keinen Grund, das zu tun. So dass es ein Zeiger erfordert, dass Sie ein dynamisches Objekt von vector<int> zu schaffen, die Sie benötigen, um die Lebensdauer von (einschließlich Aufruf löscht auf dem Behälterzeiger) zu verwalten. Das ist hier nicht notwendig. Angenommen, Sie sind die Behälter wollen, solange die Foo Objekt halten, Sie sind gut mit, die sie direkt enthalten ist, ohne es mit einem Zeiger zu tun.

Vorbei an den foo Zeiger wird nur den Zeiger übergeben. Das Objekt, das es zu erhalten Punkte nicht kopiert wird, nur der Zeiger auf sie zeigt, wenn necassary. Wenn Sie Java kennen, dann hilft es Ihnen, wenn ich Ihnen sagen, vorbei der Zeiger das gleiche ist, wie nur eine Referenz auf ein Objekt in Java vorbei, sagen:

Foo f = new Foo();
// just passes the reference (pointer in C++) to doIt. 
// the actual object is not copied
doIt(f);

Andere Tipps

Ich Aufruf "Foo" Instanz

Eigentlich Sie erstellen eine Instanz von class Foo .

Im Einzelnen Sie einen Speicherblock aus dem Heap Zuweisung über new () . Dieser Speicherblock ist groß genug, um enthalten Foo :: Container und was auch immer andere Kopf Klasse Foo erfordert.

(In diesem Beispiel gibt es keine. Mit anderen Klassen gibt es zusätzliche Attribute sein könnte oder vielleicht ein virtuellen Zeigertabelle.)

Natürlich new () ruft die (vielleicht Standard?) Foo :: Foo () Konstruktor, was wiederum initialisiert Foo :: Container durch die std :: vector Konstruktor.

Was wird der Umfang der Variable "Container" sein?

Container ist ein Attribut [Komponente] der Instanz foo . Es besteht, solange die Instanz foo existiert.

Scope-weise, können wir von Foo :: Container sprechen. Aber man kann nicht auf Foo :: constainer ohne eine Instanz der Klasse Foo . (Zum Beispiel das Objekt foo ). Foo :: constainer existiert nicht ohne eine Instanz der Klasse Foo .

(Es gibt Klassenvariablen, die etwas anders arbeiten, wo ein Wert über alle Instanzen hinweg gemeinsam genutzt wird. Aber das ist hier nicht der Fall.)

Das Scoping ist IRRELEVANT , um Ihren öffentlichen / geschützt / privater / Freund Mitglied-Access-Control.

z. B. in einigen Foo :: myPublicMethod () Sie sich beziehen könnte Foo :: Container . Obwohl Sie auch die explizite Scoping in dieser Situation verzichten könnte und beziehen sich nur auf ihn als Container .

Wohlgemerkt, ist privat, können Sie keinen Zugriff auf Foo :: Container außerhalb der Klasse Foo Methoden.

Wird diese Variable existieren, bis ich die Instanz foo löschen?

Ja.

Muß ich den "Container" als Zeiger machen, um Vektor?

Nein. Sie können, aber Sie sicherlich nicht haben.

Generell empfehle ich gegen Klasseninstanz Mitglieder Zeiger gekoppelt mit neuen im Konstruktor und löschen in dem destructor sind. Es ist ineffizient und mühsam. (Der Standard Copykonstruktor kann den Zeigerwert kopieren, kann der destructor dann löschen Sie den gleichen Zeigerwert zweimal.)


Je nach Bedarf könnten Sie betrachten:

int main(int argc, char* argv[])
{
  Foo foo;
  // other method calls to which foo is passed
  return 0;
}

foo würde nach dem Gültigkeitsbereich verlassen return 0; und automatisch gelöscht. Außerdem foo würde den Stapel anstatt dem Heap zugeordnet wird.


Sie können ein gebrauchtes Exemplar von kommentierten C ++ Referenzhandbuch nützlich finden . Es ist alt, aber es hat ein hohes Signal-zu-Rausch-Verhältnis.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top