2017-10-12 1 views
-1

Ich möchte eine Funktion in C++ erstellen, um einen Zeiger auf eine Klasse mit einigen Bedingungen zu erhalten. Ich habe mehrere Instanzen für eine Klasse, die durch eine Zahl identifiziert werden. Abhängig von der Nummer möchte ich die entsprechende Instanz erhalten.Äquivalent zu aus C# in C++

In C# würde es so etwas wie sein:

class main 
{ 
    private Example item1; 
    private Example item2; 
    private Example item3; 
    private Example item4; 

    public bool InitializeItem(int itemID) 
    { 
     bool isInitialized = false; 
     Example item; 
     if (tryGetItem(itemID, out item)) 
     { 
      item = new Example(itemID); 
      isInitialized = true; 
     } 
     return isInitialized; 
    } 

    private bool tryGetItem(int itemID, out Example item) 
    { 
     bool canGet = false; 
     item = null; 
     switch (itemID) 
     { 
      case 1: 
       item = item1; 
       canGet = true; 
       break; 
      case 2: 
       item = item2; 
       canGet = true; 
       break; 
      case 3: 
       item = item3; 
       canGet = true; 
       break; 
      case 4: 
       item = item4; 
       canGet = true; 
       break; 
     } 
     return canGet; 
    } 
} 

class Example 
{ 
    int number { get; set; } 
    public Example(int i) 
    { 
     number = i; 
    } 
} 

Aber in C++ Ich bin ein wenig mit Referenzierung und Zeiger verwirren. Ich lese einige Tutorials wie this one (auf Französisch). Ich habe grundlegende Zeiger verstanden, aber mit Klassen und Funktionen bin ich verloren.

Mit erster Antwort, änderte ich meinen Code:

Example item1; 
Example item2; 
Example item3; 
Example item4; 

bool tryGetItem(int b, Example &ptr) 
{ 
    bool canGet = false; 
    ptr = NULL; 
    switch (b) 
    { 
    case 1: 
     ptr = item1; 
     canGet = true; 
     break; 
     /* etc */ 
    } 
    return canGet; 
} 

bool InitializeItem(int id) 
{ 
    bool isInit = false; 
    Example ptr = NULL; 
    if (getParam(id, ptr)) 
    { 
     ptr = Example(id); 
     isInit = true; 
    } 
    return isInit; 
} 

Aber es funktioniert nicht. Ich habe versucht zu debuggen, ist wahr, in der {..} die Variable ptr ist korrekt auf 1 gesetzt, aber item1 ändert sich nicht.

Bearbeiten: Ich glaube nicht, dass es das gleiche Problem ist, dass mögliche doppelte Post. Ich möchte nicht ändern ptr in tryGetItem, ich möchte tryGetItem verwenden, um ptr auf einen meiner itemX zeigen. Nach der Verwendung von tryGetItem mit dem Wert 1 muss die Änderung ptr auch item1 ändern.

+5

Suchen Sie nach "pass by reference" '&' und lesen Sie ein [gutes C++ Buch] (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – UnholySheep

+0

C++ funktioniert anders als C#. Objekte werden normalerweise so gehandhabt, wie Sie es behandeln und "int" zum Beispiel in C#. Objekt in C++ ist normalerweise nicht "Verweis auf ein Objekt auf dem Heap", sondern mehr als "Objekte sind einfach Objekte, wie Ints sind einfach Ints" –

+0

Im Allgemeinen wird die Rückgabe der Ausgabe gegenüber einem Ausgabeparameter bevorzugt. –

Antwort

2

Verwenden Sie eine Referenz:

bool tryGetItem(int b, Example & var) 
{ 
} 

Sie können es ganz einfach:

int main() 
{ 
    Example var; 
    tryGetItem(42, var); 
} 

Sofern nicht wirklich notwendig, da keine andere Lösung zur Verfügung steht, avoir mit nackten Zeiger in C++, bevorzugen Referenzen oder Smart Zeiger. In Ihrem Fall ist eine Referenz die beste Wahl und wird perfekt für Sie emulieren out.

+0

Danke für die Antwort. Ich habe Ihre Lösung versucht, aber wenn ich 'tryGetItem (2, var);' (um auf 'item2' zu zeigen) und' var = Example (2) 'wird die Variable' var' korrekt auf 2 gesetzt, aber 'item2' ändert sich nicht. –