Probleme mit klassenübergreifenden Zugriff(Neu)



  • Hallo Leute, meine Problembeschreibung vom letzten Mal war anscheinend sehr dürftig. Ich habe die letzten Tage nochmal viel rumprobiert konnte aber mein Problem selbst nicht lösen. Deswegen probiere ich mein Problem jetzt nochmal, hoffentlich verständlicher, zu erläutern...
    Also ich habe drei Klassen, zwei davon sind mit grafischer Oberfläche und die dritte Klasse ist nur dazu da um einen QVector zu verwalten. Jetzt greife ich von einer der beiden Klassen(spielfeld-Klasse) auf die QVector-Klasse zu um in den QVector Zahlen zu setzen. Das klappt auch(Ich lasse die Zahlen zu Testzwecken wieder ausgeben). Nun möchte ich aber auf genau diese Zahlen von der anderen Klasse(mainWindow) zugreifen um mit diesen Zahlen weiter zu arbeiten und genau das klappt nicht ich kriege immer nur die Zahlen ausgegeben mit dem der QVector initialisiert wurde. Hoffentlich war das verständlicher und irgendjemand von euch ist bereit mir zu helfen :).

    #ifndef VECTORKLASSE_H
    #define VECTORKLASSE_H
    #include <QVector>
    
    
    class vectorklasse
    {
    public:
        QVector<int> dice;
        int wuerfel{0};
        vectorklasse();
    
        void setValueVector(int &zahl);
        QVector<int> getValueVector();
    };
    
    #endif // VECTOR_H
    
    

    Vectorklasse cpp

    
    vectorklasse::vectorklasse()
    {
        /*for (int i = 0; i< 5; i++)
        {
            dice.append(i);
        }*/
        dice = QVector<int>{0,1,2,3,6};
    }
    
    void vectorklasse::setValueVector(int &zahl)
    {
            if (wuerfel == 4)
                wuerfel =0;
            else
            {
                dice[wuerfel] = zahl;
                wuerfel++;
            }
    }
    
    QVector<int> vectorklasse::getValueVector()
    {
        return dice;
    }
    
    

    spielfeld Header

    #ifndef SPIELFELD_H
    #define SPIELFELD_H
    
    #include <QWidget>
    #include <vectorklasse.h>
    #include <QLabel>
    
    using namespace std;
    
    namespace Ui {
    class spielfeld;
    }
    
    class spielfeld : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit spielfeld(QWidget *parent = 0);
        ~spielfeld();
        vectorklasse *zeigerAufVector;
        QVector<int> vector1;
        QList<int> punkte;
        QList<int> vectorList;
    
        QLabel *wuerfelLabel[5];
        int x=20, y=10;
        int round{0};
    
        QPixmap wuerfelBild[6];
    
        void bildAuswahl();
    
        vectorklasse * getZeigerAufVector();
    
    

    Spielfeld cpp

    #include "spielfeld.h"
    #include "ui_spielfeld.h"
    #include <QLabel>
    #include <vectorklasse.h>
    
    spielfeld::spielfeld(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::spielfeld)
    {
        ui->setupUi(this);
        srand(time(0));
        zeigerAufVector =  new vectorklasse;
    
        for (int i =0; i<5; i++)
        {
            vector1.append(i);
        }
    
    }
    
    spielfeld::~spielfeld()
    {
        delete ui;
        delete zeigerAufVector;
    }
    
    void spielfeld::on_pushButton_clicked()
    {
        for (int i=0; i<5; i++)
        {
            int temp = rand() %6+1;
            zeigerAufVector->setValueVector(temp);
        }
        vectorList.clear();
        punkte.clear();
        ui->listWidget->clear();
        vector1 = zeigerAufVector->getValueVector();
        vectorList = vector1.toList();
        punkte.append(vectorList);
        foreach (int var, punkte) {
            ui->listWidget->addItem(QString::number(var));
        }
        if (round >2)
            this->close();
        else
            bildAuswahl();
        round++;
    
    }
    
    
    vectorklasse* spielfeld::getZeigerAufVector()
    {
        return zeigerAufVector;
    }
    
    

    mainWindow header

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <vectorklasse.h>
    #include <spielfeld.h>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        vectorklasse *zeigerAufVector;
        QList<int> punkte;
        QList<int> vectorList;
        vectorklasse obj;
        spielfeld *ptr;
    
    
    
    private slots:
        void on_pushButton_clicked();
    
        void on_lineEdit_selectionChanged();
    
    private:
        Ui::MainWindow *ui;
    
    };
    
    #endif // MAINWINDOW_H
    
    
    

    mainWindow cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "spielfeld.h"
    #include <vectorklasse.h>
    #include <algorithm>
    #include <spielfeld.h>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        ptr = new spielfeld;
    }
    
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        spielfeld *neuesFenster = new spielfeld;
        neuesFenster->show();
    }
    
    void MainWindow::on_lineEdit_selectionChanged()
    {
        zeigerAufVector = ptr->getZeigerAufVector();
        QVector<int>vector1 = zeigerAufVector->getValueVector();
        vectorList = vector1.toList();
        punkte.append(vectorList);
        foreach (int var, punkte) {
            ui->listWidget->addItem(QString::number(var));
        }
    }


  • Um nochmal weiter meine Absicht zu erklären. Ich musste ja in der spielfeld.cpp eine Instanz der Klasse "vectorklasse" bilden um auf die Klasse zuzugreifen und den QVector mit Zahlen zu füllen und ich glaube das genau da mein Problem liegt, irgendwie kriege ich es anscheinend nicht hin genau auf diese Instanz von der anderen Klasse zuzugreifen. Aber ich verstehe nicht wieso, meiner bescheidenen Meinung nach, mache ich den Zugriff korrekt 🙂 bitte klärt mich auf...



  • Sorry, aber da paßt einiges nicht in deinem Code:

    • Warum verwendest du für die Member (z.B. vectorklasse *zeigerAufVector oder spielfeld *ptr) Zeiger anstatt Objekte?
    • Und die vielen QVector- und QList-Member sind auch nicht alle nötig (sondern sollten höchstens lokale Variablen sein). Die Member einer Klasse beschreiben zusammen den Zustand eines Klassenobjekt.
    • Und die Initialisierung des Zufallsgenerators (srand(time(0))) sollte nur einmalig im Hauptprogramm erfolgen.

    Dein eigentliches Problem ist aber, daß du in MainWindow::on_pushButton_clicked ein neues spielfeld-Objekt erstellst (und in einer lokalen Variable ablegst), in MainWindow::on_lineEdit_selectionChanged aber auf das nicht-sichtbare spielfeld-Objekt (welches mittels ptr verfügbar ist) zugreifst.

    Du mußt lernen, deinen Code so aufzubauen, daß klar ist, daß jede Variable (Member) einen eindeutigen Sinn erfüllt (und passend benannt sein sollte).



  • @Th69
    Okay danke für den Input, genau deswegen übe ich ja an solchen Projekten, um zu lernen und besser zu werden, deswegen vielen Dank für deine Analyse.
    Ich dachte zu Beginn das es in diesem Fall einfacher ist mit Zeigern zu arbeiten anstatt mit Objekten(aber ich merke schon das dies nicht der Fall ist 🙂 ). Zu dem zweiten Punkt, gut zu Wissen, dass das so Unsauber ist ich werde in Zukunft probieren das zu ändern und zum dritten Punkt ich dachte immer das ich

    (srand(time(0)))
    

    immer in der Klasse initialisieren muss in der ich es auch verwende, aber gut zu wissen das dies anscheinend nicht der Fall ist. Wie gesagt vielen Dank für die Antwort. Habe wieder was gelernt 🙂



  • @chrisLA86 sagte in Probleme mit klassenübergreifenden Zugriff(Neu):

    ich dachte immer das ich
    (srand(time(0)))
    immer in der Klasse initialisieren muss in der ich es auch verwende

    Der wichtige Punkt bei @Th69 war das "einmalig". Wo das passiert ist völlig wurscht. Hauptprogramm bietet sich da nur an, muss aber nicht dort gemacht werden.



  • Ja, bitte den PRNG nur einmal initialisieren ...


Anmelden zum Antworten