Je suis un utilisateur Java de longue date qui apprend le C++ avec Qt et j'ai beaucoup de mal à comprendre le fonctionnement des méthodes. En ce moment, j'essaie de comprendre les bases de données et j'ai essayé de simplifier mon code avec un en-tête. Normalement, en Java, je n'aurais qu'une classe appelée DatabaseControl avec une méthode void qui exécuterait tout ce que je voulais. Par exemple, ajouter un employé à une base de données, comme je le fais maintenant. Je instancier la classe, en faisant quelque chose comme
DatabaseControl myDBControl = new DatabaseControl();
puis exécutez la méthode avec
myDBControl.addEmploye();
qui ferait apparaître la série de zones de saisie permettant à l'utilisateur de saisir les informations sur l'employé - nom, service, etc.
Passons maintenant au C++. J'ai ma tête
class DatabaseControl
{
public:
DatabaseControl();
~DatabaseControl();
//Methods
void addEmployee();
};
Je n'ai aucun paramètre dans mes constructeurs, car tout ce que je veux, c'est appeler la méthode "addEmployee" dans mon main, comme je l'ai montré ci-dessus. Dans le même fichier d'en-tête, j'ai sous la déclaration de classe
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();
}
}
et puis dans ma main j'ai ceci:
void MainWindow::on_addEmployee_clicked()
{
DatabaseControl myDBControl();
myDBControl.addEmployee();
}
que je m'attendais juste à exécuter la méthode addEmployee que j'ai écrite dans le fichier d'en-tête. Cependant, lorsque je compile, j'obtiens l'erreur. Erreur: C2228: la partie gauche de '.addEmployee' doit avoir la classe/struct/union.
J'ai examiné d'autres exemples de cette erreur et je ne comprends pas vraiment ce qui ne va pas. Je pense que cela vient de mon incompréhension des méthodes en C++, car je sais qu'une telle chose fonctionnerait sans problème l'en-tête est correct, ce qui peut très bien ne pas l'être)
Vous avez commis une erreur ici:
DatabaseControl myDBControl();
Vous avez déclaré une fonction appelée myDBControl
ne prenant aucun argument et renvoyant une DatabaseControl
.
Les déclarations d'objet sans argument de constructeur doivent omettre le ()
:
DatabaseControl myDBControl;
Ceci est lié à (mais ce n’est pas précisément) le " le plus frustrant parse ", en ce sens que la même règle de langage provoque que les instructions sont des déclarations de fonction s’ils peuvent être analysés.
DatabaseControl myDBControl();
devrait être
DatabaseControl myDBControl;
Vous devez dire ceci:
DatabaseControl myDBControl;
myDBControl.addEmployee();
À l'appui de la réponse acceptée.
De dcl.init # 11 :
Un objet dont l'initialiseur est un ensemble vide de parenthèses, c'est-à-dire ()
, doit être initialisé en valeur.
[Remarque: étant donné que
()
n’est pas autorisé par la syntaxe de l’initialiseur,X a();
n'est pas la déclaration d'un objet de
class X
, mais le déclaration d'une fonction ne prenant aucun argument et renvoyant un X. Le formulaire()
est autorisé dans certains autres contextes d’initialisation ([expr.new], [expr.type.conv], [class.base.init]). - note de fin]