2017-01-05 3 views
0

Ich möchte foo Array von Objekten in allen Spam-Methoden verwenden. Zeiger auf Tabelle des Objekts

#include "spam.h" 
class Foo: public Bar 
{ 
public: 
    Foo(Layer* layer) 
    int getNumber() const; 
    // Something else 
}; 

class Spam: public Layer 
{ 
    Spam(); 
    // some methods 
private: 
    Bar** foo; //here is the problem 
}; 

Diese Methode (natürlich mit einem *) für mich gearbeitet, wenn ich ein Objekt wurde zu schaffen.

void Spam::fun1() 
{ 
    Bar **foo = new Bar*[1]; 
    foo[0] = new Foo(this); 
    //foo[1] = new Foo(this); 

    //foo[1]->getNumber(); // works correctly 
} 

void Spam::fun2() 
{ 
    //foo[1]->getNumber(); // foo[1] and foo[2] are NULL 
    foo[0]->getNumber(): // not working at all 

} 

Aber selbst verwende ich Bar ** foo oder Bar ** foo [2], Xcode mir zeigt, dass ich neue Zeiger erstellt zu widersprechen.

Xcode screenShoot

[Bearbeiten] bemerkte ich aus falschen Code Beispiel meine Aufsicht, Danke Jungs.

+1

Sie verwenden nicht "funktioniert ordnungsgemäß" auf eine gesunde Weise. Offensichtlich ist 'foo [1]' ein Out-of-Bounds-Zugriff. –

+0

Jede Anweisung in Ihrem Beispiel, die 'foo [1]' enthält, die "richtig funktioniert", scheint nur zu funktionieren. Es kann jederzeit ohne Grund aufhören zu arbeiten. Dies liegt daran, dass foo nur 1 Element enthält (wegen 'new Bar * [1] '), was bedeutet, dass nur der Index 0 erlaubt ist (für ein Array der Größe N können Sie auf die Indizes 0 bis N-1 zugreifen). Weitere Informationen zu nicht definiertem Verhalten finden Sie unter [Antwort] (http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior). –

+0

Okey, ich stimme zu, das ist meine Schuld, es ist meine sogar foo [0], arbeitet in Spam :: fun1(), aber ich suche nach korrekten Weg, darauf zu zeigen und das gleiche Objekt in Spam :: fun2() zu verwenden mein Problem. – chriss

Antwort

2

In Ihrem fun1 die Aussage Bar **foo = new Bar*[1]; definiert einen neuen, lokalen Variable foo, die die Klassenmitgliedsnamen verbergen.

Wenn Sie stattdessen auf das Klassenmitglied verweisen möchten, sagen Sie foo = new Bar*[1];.

0

Es sieht aus wie Sie einen Pufferüberlauf hier haben:

Bar **foo = new Bar*[1]; // allocate one-element array of pointers to Bar 
foo[0] = new Foo(this); // valid assignment 
foo[1] = new Foo(this); // off the end of the array. 
0

In der Methode Spam :: fun1() haben Sie Speicher einer lokalen Variablen "foo" vom Typ "Bar **" zugewiesen. Stattdessen müssen Sie Speicher für Ihre Klassenmitgliedsvariable "foo" reservieren. Zwei Dinge, die Sie tun können, um dieses Problem zu lösen,

  1. Entfernen Sie die lokale Variable Deklaration von "foo" für diese verwenden Sie den Code unten statt "Bar ** foo = new Bar * [1];" in "Spam :: fun1()".

    foo = neuer Balken * [1];

  2. Wenn Sie die lokalen Variable aus irgendwelchen Gründen, verwenden Sie "dieser" Zeiger, um anzuzeigen, die Klasse Mitglied,

    this-> foo = new Bar * [1] halten wollten;

Nur ein Vorschlag, können Sie diese Art von Verwirrungen vermeiden, wenn Sie wie unten richtige Namenskonventionen in Ihrem Quellcode folgen.

class CSpam: public CLayer 
{ 
private: 
Bar ** mFoo; 
}; 

void Spam::fun1() 
{ 
    mFoo = new Bar*[1]; 
} 
+0

[Google C++ - Stilleitfaden] [2] [C++ - Programmierrichtlinien] [3] [GCC C++ - Kodierungskonventionen] [1] [1]: https: //gcc.gnu.org/wiki/CppConventions [ 2]: https://google.github.io/styleguide/cppguide.html [3]: http://geosoft.no/development/cppstyle.html –

Verwandte Themen