aus einer Klasse auf eine andere zugreifen



  • Hallo!

    Vorweg: ich habe das Forum durchsucht, und auch methoden wie diese: http://www.c-plusplus.net/forum/viewtopic-var-t-is-175446-and-highlight-is-zugriff+klasse.html oder http://www.c-plusplus.net/forum/viewtopic-var-t-is-171254-and-highlight-is-zugriff+klasse.html
    versucht, was bei mir aber nicht geklappt hat.

    Zu meinem Problem:

    Ich habe 2 Klassen:

    class MainWindow : public QMainWindow
    {
    
    public:
    	MainWindow();
    	QString Ename;
    ...
    };
    
    class optionMode : public QWidget
    {
    
    public:
    	optionMode(QWidget *parent = 0);
    	QLineEdit *opt_nameLEdit;
    ...
    };
    

    Jetzt will ich aus der MainWindow klasse, eine Funktion von opt_nameEdit aufrufen:

    //ich befinde ich in MainWindow
    Ename = "Test";
    optionMode.opt_nameLEdit->setText(Ename);
    

    Meinen Compiler (gcc mit Xcode) freut das aber nicht:

    request for member 'opt_nameLEdit' in '((MainWindow*)this)->MainWindow::optionMode', which is of non-class type 'QWidget*'
    

    ich weiß nicht, wie ich anders zugreifen soll...

    danke red



  • Du musst Dir klar werden, worauf Du zugreifen möchtest. Eine Klasse ist erstmal nur eine Beschreibung einer Struktur. Damit Du auf die Struktur zugreifen kannst, musst Du ein Objekt haben. Also EIN optionMode (oder auch zwei, oder drei).

    Wenn Du das "zwei, oder drei" richtig einordnest wirst Du sehen, dass der Compiler nicht glücklich sein KANN, wenn Du auf optionMode zugreifst, denn er weiss nicht welches Du meinst. Du kannst ja z.B. auch nicht auf QString.length() zugreifen, sondern nur auf Ename.length().

    Also, Du musst irgendwo Objekte von diesem Typ erstellen (am besten natürlich in der MainWindow-Klasse). Dann kannst Du auf diese Objekte auch zugreifen.



  • Du kannst entweder nur auf die Funktionen einer Objektinstanz zugreifen oder auf statische Methoden. Du willst wohl das erste.

    Du brauchst natürlich erst einmal ein Objekt vom Typ "optionMode", bevor du dessen Funktionen aufrufen kannst.

    Also zB: (in MainWindow...)

    optionMode op = new optionMode(this);
    op.opt_nameLEdit->setText(EName);
    


  • danke!

    ich bin etwas mit den Klassen durcheinander gekommen.

    Ich habe mich bei folgendem Code an eine Anleitung gehalten:

    modeWidget = new QStackedWidget;
    	modeWidget->addWidget(new startMode);
    	modeWidget->addWidget(new optionMode);
    	modeWidget->addWidget(new responseMode);
    

    jetzt habe ich gedacht, dass optionMode eh ein Objekt der Klasse QWidget ist.. was wohl nicht der Fall ist.

    optionMode op = new optionMode(this);
    op.opt_nameLEdit->setText(Ename);
    

    bringt geht auch nicht.

    Grundsätzlich erstelle ich zuerst eine Klasse (optionMode). Dannach eine Instanz der Klasse (op) in meiner ersten Klasse (MainWindow)?

    Liege ich richtig so weit?
    Wo harkt es dann bei mir?

    dnake
    red



  • versuch mal

    optionMode* op = new optionMode(this);
    op->opt_nameLEdit->setText(Ename);
    

    oder statisch

    optionMode op(this);
    op.opt_nameLEdit->setText(Ename);
    


  • Mit modeWidget->addWidget(new optionMode); erzeugst du zwar ein Objekt vom Typ, behälst dir aber keine direkte Referenz darauf.

    Möglich wäre folgendes:

    optionMode *opMode;
    modeWidget->addWidget(opMode = new optionMode());
    
    opMode->...
    

    Dann kannst du über opMode darauf zugreifen. Vielleicht solltest du dir die Grundlagen der Objektorientierung von C++ noch einmal genauer anschauen. Mit new erzeugst du die Objekte und dieses gibt einen Pointer auf das neu angelegte Objekt zurück.
    Das : public QWidget bei der Definition deiner Klasse heißt nur, daß es eine Erweiterung des Typs QWidget ist. Mit anderen QWidget hat es im Grunde dann nichts mehr zu tun.

    Erstell dir den Dialog doch mit dem designer. Da kannst dann direkt im Code auf alle Elemente zugreifen und musst dich damit nicht herumschlagen. 😉



  • REDSTAR schrieb:

    jetzt habe ich gedacht, dass optionMode eh ein Objekt der Klasse QWidget ist.. was wohl nicht der Fall ist.

    Richtig. optionMode ist eine Klasse, die von QWidget erbt. D.h. jedes Objekt vom Typ optionMode IST ein QWidget, deshalb ist aber optionMode selbst noch kein Objekt.

    optionMode op = new optionMode(this);
    op.opt_nameLEdit->setText(Ename);
    

    bringt geht auch nicht.

    Ist nur syntaktisch falsch, s. Ramsis' Post.

    Grundsätzlich erstelle ich zuerst eine Klasse (optionMode). Dannach eine Instanz der Klasse (op) in meiner ersten Klasse (MainWindow)?

    Genau. Genauergesagt eine oder mehrere Instanzen. Du beschreibst mit Deiner Klasse optionMode quasi ein neues Widget, also ein "Ding" in einer Fensteranwendung, welches irgendwas anzeigt oder irgendwie reagiert. Davon darfst Du jetzt so viele wie Du möchtest auf Deine Form klatschen (so, wie Du auch mehrere unterschiedliche Buttons haben kannst, die alle vom Typ QButton sind).

    Um mal auf das Codestück zu sprechen zu kommen:

    modeWidget = new QStackedWidget;
        modeWidget->addWidget(new startMode);
        modeWidget->addWidget(new optionMode);
        modeWidget->addWidget(new responseMode);
    

    Hier fügst Du dem modeWidget ein neues Widget vom Typ optionMode hinzu (vgl. "new optionMode"). Allerdings kennt jetzt nur noch modeWidget dieses neue optionMode, da Du dir den Zeiger, den Du von new bekommst, nirgendwo merkst. Änderst Du das Beispiel wie folgt ab, hast Du plötzlich auch die Möglichkeit auf Dein optionMode zuzugreifen:

    modeWidget = new QStackedWidget;
    /* ... die Zeilen mit startMode und responseMode habe ich weggelassen */
    optionMode* myOptionMode = new optionMode;
    modeWidget->addWidget(myOptionMode);
    /* ... */
    
    /* und jetzt kannst Du auf Dein neues optionMode auch zugreifen, über den Zeiger myOptionMode */
    myOptionMode->opt_nameLEdit->setText(Ename);
    


  • vielen Dank!
    Funktioniert jetzt!

    Ich werd mich weiter in Klassen einarbeiten, bin noch am Anfang meiner C++ Karriere xD

    Irgendwie mag ich den Designer nicht so, gerade weil ich mich noch nicht so auskenne, will ich jede Zeile code selber schreiben, damit ich das ganze auch verstehe, und nicht nur zusammenklicke.



  • Genau aus dem Grund, sich besser in QT etc einarbeiten etc., habe ich anfangs auch auf den Designer verzichtet. Aber jetzt will ich nicht mehr ohne. 😉


Anmelden zum Antworten