C++ Problem mit Klasseninteraktion/statischer Funktion

badday

Commander
Registriert
Sep. 2007
Beiträge
3.023
Moin zusammen,

vorab: Der Titel ist wenig aussagekräftig, ich weiß. Aber mir ist kein besserer eingefallen, es ist ein etwas verzwicktes Problem.

Folgendes Szenario:
Ich habe eine Klasse (Script), die unter anderem diese statische Funktion enthält:
Code:
static int l_pushButton ( lua_State *L)
    {
        int row = lua_tonumber(L, 1);
        int column = lua_tonumber(L, 2);
        QString label = lua_tostring(L, 3);

        MainWindow::newGrapic(1 , label, row, column); //natürlich falsch

        return 0;
    }
Es ist eine Funktion, die eine Funktion der Klasse MainWindow aufrufen sollte. Nun das Problem:
Wenn ich das so schreibe, geht es natürlich nicht, newGraphic ist schließlich nicht statisch, daher muss es mit Objekt aufrufen werden.
Leider kann ich newGraphic nicht statisch machen, da es sozusagen this benötigt, um auf das ui einer Klasseninstanz von MainWindow zugreifen zu können.
Hierzu die Funktion:
Code:
void MainWindow::newGrapic(int what, QString label, int row, int column)
{
    switch (what)
    {
        case 1:
             QPushButton *button = new QPushButton(label, this);
             ui->gridLayout->addWidget(button, row, column, Qt::AlignLeft ); //hier
    }
}
Das Problem: ui bezieht sich auf this, das ist aber in einer statischen Funktion nicht verfügbar.

Ich brauche also irgendeine Möglichkeit von einer statischen Funktion heraus auf das ui zuzugreifen. Die Funktion in Script kann darf nicht einfach von MainWindow heraus aufgerufen werden.
Ich muss irgendwie aus dem statischen raus, um auf ui zugreifen zu können.
Hat irgendjemand eine Idee, wie ich aus diesem Dilemma rauskomme?:confused_alt:

Vielen Dank!



Gruß,

badday
 
Naja ehrlich gesagt finde ich den Code nicht wirklich aussagekräftig genug, um dir eine klare Lösungsempfehlung zu geben.

Die Frage, die ich mir stelle, ist allerdings genau die selbe, die sich der Compiler stellt: Du rufst newGraphic auf, aber auf wen soll sich dieser Aufruf denn beziehen? Gibt es denn mehrere Instanzen von MainWindow?

Wenn nein, könntest du eine Art Singleton machen..
Wenn ja, woher weißt du, welche Instanz du denn selbst meinst, oder spielt das gar kene Rolle?

Die Frage ist auch: Wer ruft überhaupt l_pushButton auf? Eventuell könnte man dort auch einen zusätzlichen Zeiger-Paramter auf ein MainWindow hinzufügen...
 
Nein, das ist ja eben das Problem, der Aufruf geht natürlich nicht. Deshalb meinte ich ja, wie ich diese Problem lösen kann.
Wenn ich das so schreibe, geht es natürlich nicht, newGraphic ist schließlich nicht statisch, daher muss es mit Objekt aufrufen werden.
Es gibt nur eine Instanz, aber wie teile ich das der Funktion mit.

Mit Singleton habe ich mich noch nie beschäftigt (schau mir gerade den Wikipedia Artikel an). Würde das hier Abhilfe schaffen?

Gruß,

badday
 
Naja du könntest der Klasse MainWindow hinzufügen:
- privaten, statischen Zeiger auf ein MainWindow
- statische Methode, welche diesen Zeiger zurückliefert

Im Konstruktor von MainWindow wird dieser Zeiger mit "this" belegt dann.

In l_pushbutton holst du dir den Zeiger über die die statische Methode und kannst dann über den Zeiger newGraphic aufrufen.
 
Hey, super, das funktioniert perfekt. Großes Dankeschön, 1668mib!


Gruß,

badday
 
Zuletzt bearbeitet:
1668mib schrieb:
Naja du könntest der Klasse MainWindow hinzufügen:
- privaten, statischen Zeiger auf ein MainWindow
- statische Methode, welche diesen Zeiger zurückliefert

Im Konstruktor von MainWindow wird dieser Zeiger mit "this" belegt dann.

In l_pushbutton holst du dir den Zeiger über die die statische Methode und kannst dann über den Zeiger newGraphic aufrufen.

badday schrieb:
Mit Singleton habe ich mich noch nie beschäftigt (schau mir gerade den Wikipedia Artikel an). Würde das hier Abhilfe schaffen?

Das, was 1668mib gesagt hat beschreibt ziemlich genau das Singleton, also mache es am besten gleich nach Schema F! Soll heißen es ist immer gut sich an etablierte Standards zu halten ;-)
 
Soweit ich das überblicke, gibt es hier eigentlich keinen Vorteil, wenn ich das wie in Wikipedia beschrieben mache oder sehe ich das falsch?

Gruß,

badday
 
Ich hab dir ja schon in Grundzügen das Singleton gemacht... ein "echtes" Singleton ist bisschen komplexer, aber denke das würde einen zu großen Rattenschwanz nach sich ziehen...

(Ein Singleton hat normalerweise keinen öffentlichen Konstruktur. Die einzige Instanz wird normalerweise von der statischen Methode erzeugt, welche den Zeiger auf die Instanz zurückliefert)
 
Zurück
Oben