Dynamisches Feld und User Interface
-
Hallo,
ich möchte das dynamische Feld pAnzahl erzeugen.
Es soll die Größe iAnzahl haben.Bei einem Konsolenprogramm ist das kein Problem:
int *pAnzahl;
int iAnzahl;
pAnzahl = new int [iAnzahl];Bei einer Qt-Widgets-Anwendung jedoch schon.
An der stelle, wo das Feld erzeugt werden soll,
also bei:
pAnzahl = new int [iAnzahl];
erscheinen diese Fehlermeldungen:
-C++ requires a type specifier for all declarations
-duplicate member 'pAnzahl'In der mainwindow.ui Datei habe ich 3 Elemente:
-lineEdit um iAnzahl einzulesen.
-pushButton um iAnzahl über lineEdit einzulesen und label auszugeben.
-label um iAnzahl anzuzeigen.Die mainwindow.h Datei:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{
Q_OBJECTpublic:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();private:
Ui::MainWindow *ui;
int iAnzahl;int *pAnzahl; pAnzahl = new int [iAnzahl]; //Hier liegt das Problem (pAnzahl ist rot unterstrichen) //Diese Zeile führt auch zu Fehlermeldungen in der mainwindow.cpp Datei
private slots:
void pushButtonClicked();};
#endif // MAINWINDOW_H
Die mainwindow.cpp Datei:
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui -> pushButton, SIGNAL(clicked()), SLOT(pushButtonClicked()));
}MainWindow::~MainWindow()
{
delete ui;
}void MainWindow::pushButtonClicked()
{
iAnzahl = ui -> lineEdit -> text().toInt(); //iAnzahl über das Eingabefeld definieren
ui -> label -> setNum(iAnzahl); //iAnzahl wird in label Angezeigt (sowite funktioniert es)
}
-
Das Problem hat nichts mit Qt oder Widgets zu tun, sondern mit Klassen. Bevor du mit Fenstern spielst solltest du Klassen verstanden haben.
Benutze std::vector, nicht new[].
-
Du müßtest den Code
pAnzahl = new int [iAnzahl];
in den Konstruktor packen.
Die Frage ist jedoch, wieiAnzahl
initialisiert wird???Verwende besser
std::vector<>
oder aber die Qt-spezifische Klasse QVector.PS: Packe mal deinen Code in C++-Tags, damit man ihn besser lesen kann (über das 3-Punkte-Menü kannst du "Bearbeiten" auswählen).
-
iAnzahl wird hier initialisiert:
void MainWindow::pushButtonClicked() { iAnzahl = ui -> lineEdit -> text().toInt(); //iAnzahl wird initialisiert ui -> label -> setNum(iAnzahl); }
Den Code
pAnzahl = new int [iAnzahl];
habe ich jetzt im Konstruktor. Jetzt kommt ein Debug Error ohne beschreibung des Problems.
abort() has been called
-
iAnzahl ist auch noch nicht initialisiert.
Im moment sieht dein Programmablauf so aus:Baue MainWindow (Constructor)
-> erstelle pAnzahl der Größe iAnzahl
-> Wenn der Button geklickt wird: setze einen Wert für iAnzahlOffensichtlich etwas falsche Reihenfolge
Ich schließe mich auch den anderen an, bitte vermeide Arrays, die sind viel zu unsicher. Benutz einfach einen std::vector oder QVector
Dein Code dafür wäre:
Klasse:#include <vector> class MainWindow ... { ... private: std::vector<int> pAnzahl; };
Constructor:
iAnzahl = 0; //Hier initialisiert du iAnzahl pAnzahl = std::vector<int>(iAnzahl); //Hier wird ein vector mit iAnzahl (also 0) Elementen erzeugt
pushButtonClicked():
iAnzahl = ui -> lineEdit -> text().toInt(); //iAnzahl wird neu gesetzt ui -> label -> setNum(iAnzahl); pAnzahl.resize(iAnzahl); //Hier setzt du den vector auf die neue Größe
-
Super das funktioniert. Vielen Dank!
-
Kein Problem.
Noch ein paar Tipps von mir:- les nach und versuch zu verstehen, was der vector ist und was er tut (z.B. auf cppreference.com)
- verstehe deinen Programmablauf
- beschäftige dich mit c++ und der STL (c++ Standard Library, der vector gehört dazu, daher auch das std::)
- beschäftige dich mit Klassen
Nur so lernst du wirklich programmieren, vor allem die STL ist wichtig. Nur vorgekaute Lösungen wie meine bringen dich nicht weiter, du musst verstehen, was genau du da tust.
Vor ein paar Jahren stand ich genau an dem gleichen Punkt, ich hatte ein bisschen Basis"wissen" ("Es gibt Klassen, Variablen, Funktionen und Pointer...") und kannte die STL nicht. Daher meine Tipps, damit du einen Einstiegspunkt hast...