2017-12-01 7 views
-1

Ich habe eine Struktur, die in einem Klassenkonstruktor initialisiert wird, und ich brauche die Struktur, um einen Zeiger mit der Speicheradresse der Klasse, die es initialisiert, so dass, wenn ich den Callback der Struktur aufrufen, Es kann die Instanz der Klasse, die es als Parameter hat, senden. HierKlasseninstanz Speicheradresse im Konstruktor C++

ist ein Code:

struct TouchZone { 

    int Layer; 
    bool Active = false; 
private: 
    int Width; 
    int Height; 
    int X; 
    int Y; 
    Button *linkedButton; 
    void(*Callback)(Button &sender); 

public: 
    TouchZone() 
    { 

    } 

    TouchZone(int width, int height, int x, int y, void((*callback)(Button &sender)), int lyr = 100) 
    { 
     Width = width; 
     Height = height; 
     X = x; 
     Y = y; 
     Active = true; 
     Callback = callback; 
     Layer = lyr; 
} 

    Button* getLinkedButton() { 
     return linkedButton; 
    } 

    void resize(int width, int height, int x, int y, int lyr = -1) { 
     Width = width; 
     Height = height; 
     X = x; 
     Y = y; 
     if (lyr != -1) 
     { 
      Layer = lyr; 
     } 
    } 

    void UseCallback() { 
     Callback(*linkedButton); 
    } 

    int getX() { 
     return X; 
    } 

    int getSpanX() { 
     return X + Width; 
    } 

    int getY() { 
     return Y; 
    } 

    int getSpanY() { 
     return Y + Height; 
    } 

    bool CheckBounds(int tX, int tY) { 
     if (((tX >= this->X) && (tX <= this->getSpanX())) && ((tY >= this->Y) && (tY <= this->getSpanY()))) { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    void SetLinkedButton(Button *butt) { 
     linkedButton = butt; 
    } 

}; 

class Button { 
public: 
    int Color; 
    int layer; 
    Outline outline; 
    RectType rectType; 
    int getSpanX(); 
    int getSpanY(); 
    int getX(); 
    int getY(); 
    bool isEnabled(); 
    bool PressChecking = false; 
    void enable(); 
    void disable(); 
    void draw(); 
    void resize(int ix, int iy, int isx, int isy); 
    Button(); 
    Button(int ix, int iy, int isx, int isy, int color, void(*callback)(Button& sender), RectType bt, Outline ot, bool pressCheck); 
    static void FindButtonPressed(int x, int y); 
    TouchZone theZone; 
private: 
    String Text; 
    static LinkedList<TouchZone> YaBoisTouches; 
    int X, Y, SizeX, SizeY; 

}; 
int Button::getSpanX() { 
    return (this->X + this->SizeX); 
    } 
int Button::getSpanY() { 
    return (this->Y + this->SizeY); 
} 
int Button::getX() 
{ 
    return this->X; 
} 
int Button::getY() 
{ 
    return this->Y; 
} 
Button::Button() { 

} 
Button::Button(int ix, int iy, int isx, int isy, int color, void(*callback)(Button &sender), RectType bt, Outline ot, bool pressCheck){ 
    this->X = ix; this->Y = iy; this->SizeX = isx; this->SizeY = isy; this->outline = ot; this->rectType = bt; this->Color = color; this->PressChecking = pressCheck; 
    this->draw(); 

    theZone = TouchZone(this->SizeX, this->SizeY, this->X, this->Y, callback); 
    theZone.SetLinkedButton(this); //This is where I try to pass the specific instance of this class to the struct. 
    Button::YaBoisTouches.add(theZone); 
} 
void Button::resize(int ix, int iy, int isx, int isy) { 
    this->X = ix; this->Y = iy; this->SizeX = isx; this->SizeY = isy; 
    theZone.resize(this->SizeX, this->SizeY, this->X, this->Y); 
    this->draw(); 
} 
void Button::FindButtonPressed(int x, int y) { 
    TouchZone FoundZone; 
    int HighestLayer = 0; 
    for (int i = 0; i < Button::YaBoisTouches.size(); i++) 
    { 
     if (Button::YaBoisTouches.get(i).CheckBounds(x, y)) { 
      if (Button::YaBoisTouches.get(i).Layer > HighestLayer) { 
       HighestLayer = YaBoisTouches.get(i).Layer; 
       FoundZone = YaBoisTouches.get(i); 
      } 
     } 
    } 
    if (FoundZone.Active) { 
     if (FoundZone.getLinkedButton()->PressChecking) { 
      if (!pressed) { FoundZone.UseCallback(); } 
     } 
     else { 
      FoundZone.UseCallback(); 
     } 
    } 
} 

Im Konstruktor der Klasse Button Ich erstelle eine TouchZone Struktur. In der Struktur versuche ich einen Zeiger auf die spezifische Instanz der Button Klasse zu speichern, die das TouchZone erstellt hat. Ich kann nicht herausfinden, wie ich das im Konstruktor richtig machen kann, noch weiß ich, ob es möglich ist. Was ich hier habe, kompiliert, aber mein Mangel an Wissen mit Zeigern und Speicheradressen scheint mir Ergebnisse zu geben, die ich nicht will.

Dies ist eine Beispielfunktion, wie ich den Verweis der Klasse Button auf einen Rückruf verwenden möchte.

void HomeScreen(Button& sender) { 
    Serial.println(sender.getSpanX()); //Prints some number like 2133411092 but varies every time. Should be 200. 
    Serial.println(sender.theZone.getSpanX()); //Constantly prints 85, but should also be 200. 
    sender.disable(); 
    theScreen.fillScr(VGA_MAROON); 
    delay(300); 
    theScreen.fillScr(VGA_WHITE); 
    Serial.println(sender.getX()); //Usually prints some number like -149863422 but varies every time 
    sender.resize(sender.getX(), 10, sender.getSpanX(), sender.getSpanY()); //The button disappears on the screen, which it should not. 
    sender.enable(); 

} 

Diese Frage ist meine erste, und ich denke, es könnte zu aufgebläht sein. Zur Erinnerung, mein Ziel ist es, eine Klasseninstanzreferenz an eine Struktur innerhalb des Konstruktors der Klasse zu übergeben.

Antwort

0

this Der Zeiger wird erstellt, nachdem der Aufruf des Konstruktors abgeschlossen wurde.

Der Zeiger wird erst erstellt, nachdem der Aufruf des Konstruktors abgeschlossen ist. Sie können den Klassenzeiger nicht verwenden, bevor der Konstruktoraufruf abgeschlossen ist. - miradham

+1

Nun, mein Kommentar war keine Antwort ... und Sie müssen die Verwendung für Ihren speziellen Fall detaillierter überprüfen. – miradham

+1

Der 'this'-Zeiger ist im Konstruktor gültig. Sie können es nicht viel benutzen, da das Objekt noch nicht vollständig konstruiert ist, aber Sie können es speichern und später verwenden. –

+0

@BoPersson Mache ich das nicht, wenn ich den Zeiger auf die TouchZone-Struktur übergebe? Ich verwende den Zeiger nicht, bis die Schaltfläche tatsächlich konstruiert und auf der Benutzeroberfläche sichtbar ist, mit der ich verbunden bin. – AadamZ5

0

passieren entweder einen Zeiger auf die Button an den Konstruktor für das theZone oder fügen eine setLinkedButton Klasse TouchZone, und rufen, dass in dem Körper des Button Konstruktor.

Verwandte Themen