web-dev-qa-db-fra.com

Erreur: C2228: to right of

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)

21
Lighthat

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.

32
DatabaseControl myDBControl();

devrait être 

DatabaseControl myDBControl;
1
Digital_Reality

Vous devez dire ceci:

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

À 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]

0
codekaizer