2016-03-29 16 views
-2

Aus Gründen der Geschwindigkeit habe ich Zeiger verwendet, um Objekte zu umgehen. Wenn ich versuche, auf eine Elementvariable eines Objekts innerhalb eines Objekts zuzugreifen, stürzt mein Programm jedoch ab. Gibt es etwas, das ich nicht verstehe?C++ Zugreifen auf Mitglied des verschachtelten Objekts über Zeiger

/* 
ClassA 
- ObjectB 
    --Member X 
*/ 

class A 
{ 
    int x; 
} 

class B 
{ 
    A* obj; // initialized in constructor 
    B(); 
    func(); 
} 

B::B(std::vector<A> vectorA) 
{ 
    this->obj = &(vectorA.at(0)) 
} 

B::func() 
{ 
    A* pointerA = this->obj 
    std::cout << pointerA->x << std::endl; // causes crash 
} 
+2

_'A * obj; // im Konstruktor initialisiert'_ Wie genau? Poste bitte [MCVE]. –

+0

"Aus Gründen der Geschwindigkeit ..." Sind Sie sicher, dass Zeiger schneller sind? Dein Compiler denkt vielleicht nicht so. – tadman

+1

'this-> obj = & (vectorA.at (0));' das ist furchtbar gefährlich, wenn du nicht vorsichtig bist. Ihr Zeiger wird auf Crom zeigen, wenn der Vektor die Größe ändert. – user4581301

Antwort

1

Ein früheres Poster, das ihren Kommentar korrekt gelöscht hat, hat darauf hingewiesen, dass der Vektor, der an meinen Konstruktor übergeben wurde, nicht als Referenz verwendet wurde und deshalb zerstört wurde und den Zeiger baumeln ließ.

B::B(std::vector vectorA)

sollte

sein

B::B(std::vector &vectorA)

Danke Art Fremder!

+0

Da du es in deiner Frage bearbeitet hast, dachte ich eigentlich, das war ein Tippfehler deinerseits;) Deshalb habe ich die Antwort gelöscht. –

1

Sie vermissen ein Semikolon

  A* pointerA = this->obj; 

Fix, dass

class A 
{ 
    int x; 
}; 

Sie sind zu in diesem ein Semikolon fehlt. Fehler, die ich habe:

11: 9: Fehler: ISO C++ verbietet Erklärung 'Func' ohne Typ [-fpermissive]

8: 1: Fehler: neue Typen können nicht in einer Rückkehr definiert werden Typ

8: 1: Anmerkung: (vielleicht ein Semikolon nach der Definition von 'B' fehlt)

14: 1: Fehler: Prototyp für 'BB :: func()' paßt nicht jeder in Klasse 'B'

11: 4: Fehler: Kandidat ist: int B :: func()

Fix diese zuerst.

0

Wie @ user4581301 wies darauf hin: this->obj = &(vectorA.at(0)) ist unglaublich gefährlich. So sehr, dass der Zeiger schwingt, sobald die Funktion beendet wird.

Mit der Funktionssignatur B::B(std::vector<A> vectorA) erstellt Ihre Funktion eine Kopie des Vektors, den Sie übergeben, der beim Beenden der Funktion zerstört wird. Dies bedeutet, dass der Zeiger, den Sie gerade erstellt haben, baumelt.

Ich glaube, Sie etwas zu tun bedeutete wie:

B::B(std::vector<A> &vectorA) 

diese Weise wird der Vektor Sie innerhalb der Funktion verwenden ist eigentlich die gleiche wie die, die Sie als Argument übergeben. Auf diese Weise ist der Zeiger gültig, solange der Vektor, an dem Sie vorbeifahren, nicht zerstört (oder in der Größe verändert) wird.

Verwandte Themen