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)
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;
Sie müssen das sagen:
DatabaseControl myDBControl;
myDBControl.addEmployee();
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]