Argumentübergabe zum neuen Fenster

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
user710
Beiträge: 5
Registriert: 11. September 2010 17:44

Argumentübergabe zum neuen Fenster

Beitrag von user710 »

Hallo,
ich versuche nach dem Starten des neuen Fenster Argumente für die "Weiterverarbeitung" zu übergeben.
Konkret zu meinem Beispiel:
Ich baue mir gerade ein notifyme Programm. Nun will ich im Main-Fenster die Liste aller eingetragenen Personen mit Mails zeigen und im 2 Fenster soll besteht die Möglichkeit, die Liste zu erweitern.

Nun möchte ich euch meinen bisherigen Code in Ausschnitten zeigen.

Die Main.h Datei

Code: Alles auswählen

...
#include <QtGui>

...

struct Data
{
    int id;
    QString vorname;
    QString nachname;
    QString emailadresse;
    bool status;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
   ...
    QVector<Data> adressen;

private:
    Ui::MainWindow *ui;

public slots:
    void add();
    void save();
};
...
Die dazugehörige .cpp Datei:

Code: Alles auswählen

...
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
   ...
    connect(ui->hinzufuegen, SIGNAL(clicked()), this, SLOT(add()));
    connect(ui->actionSpeichern, SIGNAL(triggered()), this, SLOT(save()));
}

...

void MainWindow::add()
{
    add_adress *add = new add_adress(this);
    add->show();
}

void MainWindow::save()
{
    ...
}
Nun habe ich mir gedacht den QVector einfach dem Konstruktor der 2. Klasse als Referenz zu übergeben (&). Das scheint aber nicht zu funktionieren.
Ich bitte um Hilfe!
Grüße,
user710
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Scheint nicht zu funktionieren ist keine Fehlermeldung...
Und Klassen-Namen werden üblicherweise großgeschrieben (CamelCase)
user710
Beiträge: 5
Registriert: 11. September 2010 17:44

Beitrag von user710 »

Ok, wenn ich es al Referenz übergeben will, verlangt der Compiler einen Standartwert. Ich weiß leider nicht, wie ich den setzen soll...
Das geht will der Compiler auf jdene Fall nicht, da man in diesem Fall keine '{' verwenden kann!

Code: Alles auswählen

struct werte
{
    int id;
    QString vorname;
    QString nachname;
    QString emailadresse;
    bool status;
};

namespace Ui {
    class add_adress;
}

class add_adress : public QDialog
{
    Q_OBJECT

public:
    explicit add_adress(QWidget *parent = 0, QVector<werte> &adressen = {1, "", "", "", 0});
    ~add_adress();

private:
    Ui::add_adress *ui;

public slots:
    void add();
};
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Der Compiler verlangt nur einen Standardwert wenn man dem ctor nichts übergibt. Aber warum willst Du das auf einmal machen?
Und Standardwert: QVector<werte>()
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
user710
Beiträge: 5
Registriert: 11. September 2010 17:44

Beitrag von user710 »

ohne den Standartwert kommt diese Fehlermeldung:

Code: Alles auswählen

/home/simon/workspace/notifemy-build-desktop/../notifemy/add_adress.h:26: error: default argument missing for parameter 2 of ‘add_adress::add_adress(QWidget*, QVector<werte>&)’
Vielleicht kein ANSI ist aber mit dem Qt Creator 2.0.0 so...

und dass akzeptiert er nicht:
QVector<werte>()
oder
QVector<werte> &adressen = ()
oder
QVector<werte>()&adressen
oder
QVector<werte>(&adressen)
oder
QVector<werte>&adressen = (1, "", "", "", 0)

(habe deine Syntax nicht verstanden, aber irgendeine wird's wohl sein.
Wenn es eine andere Möglichkeit gibt auf die Elemente zuzugreifen, so würde ich diese natürlich wählen...!
Übrigens habe ich es schon probiert, die Klasse rein zu kopieren und dann auf die Elemente mittels MainWindow:: zu zugreifen...
Dann kam diese Fehlermeldung:

Code: Alles auswählen

/home/?/workspace/projekt/../notifemy/mainwindow.h:28: error: object missing in reference to ‘MainWindow::adressen’
Das das nicht klappt war mir aber schon vorher klar.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Deine Funktion nimmt eine nicht-konstante Referenz entgegen. Dafür muss ein nicht-temporäres Objekt existieren. Ein Default-Parameter erfüllt diese Bedingung nicht. Entweder willst du wirklich eine nicht-konstante Referenz haben, entweder um sie in einem Member zu speichern, oder der Konstruktor will das Objekt dahinter verändern. Letzteres ist nix gut, da dieser Nebeneffekt im Falle einer Exception im Konstruktor nicht zurückgenommen werden kann, deine Klasse ist nicht Exception-sicher.

Eine Alternative wäre eine konstante Referenz. Der Standard erlaubt ein temporäres Objekt als Wert für eine konstante Referenz! Ich denke auch, dass dir eigentlich eine konstante Referenz reichen sollte.

Warum du den Fehler

Code: Alles auswählen

error: default argument missing for parameter 2
bekommen hast ist dir hoffentlich klar. Du musst für alle Parameter, die auf eines mit Default-Wert folgen, ebenfalls Default-Werte angeben. Wenn das erste Argument einen Default-Wert hat, das zweite aber nicht, ist das ein Fehler.
user710
Beiträge: 5
Registriert: 11. September 2010 17:44

Beitrag von user710 »

Also gut, ich habe es jetzt für mein Projekt effektiver gemacht und eine neue Klasse speziell für meine Daten erstellt. Diese dient nicht nur der Schnittstelle der zwei anderen Klassen sondern auch der schnellen und einfachen Datenbehandlung...

Aber eine Frage hätte ich da noch:
ich habe gemerkt, dass man keine Static-Variablen benutzen kann, deshalb habe ich etwas im Internet geforscht mit dem Ergebnis, dass ich meinen Linker konfigurieren muss. Wie soll das aber mit dem QT Creator 2.0 gehen?

Grüße,
user710
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

user710 hat geschrieben:ich habe gemerkt, dass man keine Static-Variablen benutzen kann, deshalb habe ich etwas im Internet geforscht mit dem Ergebnis, dass ich meinen Linker konfigurieren muss.
Linker konfigurieren? Wo hast du das her? Wahrscheinlich deklarierst du die statische Variable nur, ohne sie in einer Implementierungsdatei zu definieren.

Code: Alles auswählen

// in myclass.h
class MyClass {
static int zahl;
};

// in myclass.cpp
int MyClass::zahl = 10;
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

ich habe gemerkt, dass man keine Static-Variablen benutzen kann, deshalb habe ich etwas im Internet geforscht mit dem Ergebnis, dass ich meinen Linker konfigurieren muss. Wie soll das aber mit dem QT Creator 2.0 gehen?
Ich weiss nicht mit welchen compiler du compilierst, aber glaub alle die der Creator unterstuetzt, koennen statische variablen.

Erzaehl uns zuerst mal, wofür Du die brauchst. In den meisten Fällen sind statische Variablen ne Design-Schwaeche. Nur in selteneren Fällen haben die überhaupt ne Daseinsberechtigung. Ich bin mir fast sicher, das sich Dein Problem ohne statische variablen sauber loesen laesst !

Ciao ...
user710
Beiträge: 5
Registriert: 11. September 2010 17:44

Beitrag von user710 »

Ja lässt es sich ja auch, ich habe ja meinen Container in den Heap geschickt. Das man statische Variablen nicht verwendet war mir vorher nicht bekannt. Aber danke für die Auskunft...;)

Grüße.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ups, sorry, wenn man nen Tag spaeter selber liesst ....

wenn Du mit "statischen Variablen" Variablen meist, die aufn Stack anlegst .. dann ist das was ich oben geschrieben hab Müll !
Stack Variablen sind natuerlich scho ok.

meinte eher die static Geschichte, was mit Stack weniger zu tun hat.

Sorry wenn ich da fuer Konfusion gesorgt hab ....

Ciao ...
Antworten