it-swarm.com.de

Fehler: C2228: Links von '' muss Klasse/Struktur/Vereinigung haben

Ich bin ein langjähriger Java-Benutzer, der C++ mit Qt lernt, und ich habe große Schwierigkeiten, die Funktionsweise von Methoden zu verstehen. Ich versuche gerade, Datenbanken herauszufinden, und habe versucht, meinen Code mit einem Header zu vereinfachen. Normalerweise hätte ich in Java nur eine Klasse namens DatabaseControl mit einer void-Methode, die ausgeführt würde, was ich wollte. Zum Beispiel das Hinzufügen eines Mitarbeiters zu einer Datenbank, wie ich es jetzt tue. Ich würde die Klasse instanziieren, indem ich so etwas mache

DatabaseControl myDBControl = new DatabaseControl();

und dann die Methode mit ausführen

myDBControl.addEmploye();

dies würde die Reihe von Eingabefeldern anzeigen, in die der Benutzer die Informationen über den Mitarbeiter eingeben kann - Name, Abteilung usw.

Also jetzt zu C++. Ich habe meinen Header

class DatabaseControl
{
public:
    DatabaseControl();
    ~DatabaseControl();

    //Methods
    void addEmployee();
};

Ich habe keine Parameter in meinen Konstruktoren, da ich einfach die Methode "addEmployee" in meinem main aufrufen möchte, wie ich oben gezeigt habe. In der gleichen Header-Datei habe ich diese unter meiner Klassendeklaration

void DatabaseControl::addEmployee(){
QSqlQuery qry;
bool ok;
QString firstName = QInputDialog::getText(NULL, "QInputDialog::getText()",
                                     "Employee first name:", QLineEdit::Normal,
                                     NULL, &ok);
if (ok && !firstName.isEmpty()){}
else{
    QMessageBox msgBox;
    msgBox.setWindowTitle("Error");
    msgBox.setText("Failed to add employee.\nReason: No employee name given.");
    msgBox.exec();
}
QString lastName = QInputDialog::getText(NULL, "QInputDialog::getText()",
                                     "Employee last name:", QLineEdit::Normal,
                                     NULL, &ok);
     if (ok && !lastName.isEmpty()){
         qry.prepare("INSERT INTO employees (firstname, lastname)" "VALUES (:f1, :f2)");
         qry.bindValue(":f1", firstName);
         qry.bindValue(":f2", lastName);
         qry.exec();
     }
     else{
         QMessageBox msgBox;
         msgBox.setWindowTitle("Error");
         msgBox.setText("Failed to add employee.\nReason: No employee name given.");
         msgBox.exec();
     }

}

und dann habe ich in meiner Hauptsache folgendes:

void MainWindow::on_addEmployee_clicked()
{
    DatabaseControl myDBControl();
    myDBControl.addEmployee();
}

ich habe erwartet, dass ich einfach die addEmployee-Methode ausführte, die ich in die Header-Datei geschrieben habe. Beim Kompilieren erhalte ich jedoch den Fehler. Fehler: C2228: Links von '.addEmployee' muss Klasse/Struktur/Union vorhanden sein

Ich habe mir andere Instanzen dieses Fehlers angesehen und verstehe nicht genau, was falsch ist, und ich glaube, es liegt an meinem Missverständnis von Methoden in C++, weil ich weiß, dass etwas in Java ohne Probleme funktioniert (vorausgesetzt, der Code in die Kopfzeile stimmt, was sehr wohl nicht sein kann)

21
Lighthat

Sie haben hier einen Fehler gemacht:

DatabaseControl myDBControl();

Sie haben eine Funktion namens myDBControl deklariert, die keine Argumente verwendet und eine DatabaseControl zurückgibt.

Objektdeklarationen ohne Konstruktorargumente müssen den () weglassen:

DatabaseControl myDBControl;

Dies hängt mit dem " most vexing parse " zusammen (ist aber nicht genau), da Anweisungen sind Funktionsdeklarationen, wenn sie so geparst werden können.

DatabaseControl myDBControl();

sollte sein 

DatabaseControl myDBControl;
1
Digital_Reality

Sie müssen das sagen:

 DatabaseControl myDBControl;
 myDBControl.addEmployee();
1
Kerrek SB

Zur Unterstützung der akzeptierten Antwort.

Aus dcl.init # 11 :

Ein Objekt, dessen Initialisierer ein leerer Satz von Klammern ist, d. H. (), soll mit dem Wert initialisiert werden.

[Hinweis: Da () in der Syntax für die Initialisierung nicht zulässig ist,

X a();

ist nicht die Deklaration eines Objekts von class X, sondern die Deklaration einer Funktion, die kein Argument verwendet und ein X zurückgibt. Das Formular () ist in bestimmten anderen Initialisierungskontexten zulässig ([expr.new], [expr.type.conv], [class.base.init]). - Endnote]

0
codekaizer