Fout: C2228: links van ” moet class/struct/union hebben

Ik ben een oude Java-gebruiker die C++ leert met Qt en ik heb veel moeite om te begrijpen hoe methoden werken. Op dit moment probeer ik databases te achterhalen en probeerde ik mijn code te vereenvoudigen met een header. Normaal gesproken zou ik in Java gewoon een klasse hebben met de naam DatabaseControl met een void-methode die zou uitvoeren wat ik wilde. Bijvoorbeeld het toevoegen van een medewerker aan een database, zoals ik nu doe. Ik zou de klas instantiëren door iets te doen als

DatabaseControl myDBControl = new DatabaseControl();

en voer dan de methode uit met

myDBControl.addEmploye();

die de reeks invoervakken zou oproepen voor de gebruiker om de informatie over de werknemer in te voeren – naam, afdeling, enz.

Dus nu over naar C++. Ik heb mijn kop

class DatabaseControl
{
public:
    DatabaseControl();
    ~DatabaseControl();
    //Methods
    void addEmployee();
};

Ik heb geen parameters in mijn constructors omdat ik alleen de “addEmployee”-methode in mijn main wil aanroepen, zoals ik hierboven heb laten zien. In hetzelfde header-bestand heb ik dit onder mijn klassenverklaring

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();
     }

}

en dan heb ik dit in mijn hoofd:

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

waarvan ik verwachtte dat het gewoon de addEmployee-methode zou uitvoeren die ik in het headerbestand heb geschreven. Wanneer ik echter compileer, krijg ik de foutmelding Error: C2228: left of ‘.addEmployee’ must have class/struct/union

Ik heb naar andere gevallen van deze fout gekeken en begrijp niet precies wat er mis is, en ik heb het gevoel dat het komt door mijn misverstand over methoden in C++, omdat ik weet dat in Java zoiets zonder problemen zou werken (ervan uitgaande dat de code in de koptekst is correct, wat het heel goed niet kan zijn)


Antwoord 1, autoriteit 100%

Je hebt hier een fout gemaakt:

DatabaseControl myDBControl();

Je hebt een functie met de naam myDBControlgedeclareerd zonder argumenten en een DatabaseControlgeretourneerd.

Objectdeclaraties zonder constructorargumenten moeten de ():

weglaten

DatabaseControl myDBControl;

Dit is gerelateerd aan (maar is niet precies) de “meest irritante analyse“, in die zin dat het wordt veroorzaakt door de dezelfde taalregel dat statements functiedeclaraties zijn als ze zo kunnen worden geparseerd.


Antwoord 2, autoriteit 4%

DatabaseControl myDBControl();

zou moeten zijn

DatabaseControl myDBControl;

Antwoord 3, autoriteit 2%

Je moet dit zeggen:

DatabaseControl myDBControl;
 myDBControl.addEmployee();

Antwoord 4, autoriteit 2%

Ter ondersteuning van het geaccepteerde antwoord.

Van dcl.init#11:

Een object waarvan de initialisatie een lege set haakjes is, d.w.z. (), moet worden geïnitialiseerd.

[ Opmerking: aangezien ()niet is toegestaan door de syntaxis voor initialisatie,

X a();

is niet de declaratie van een object van class X, maar de
declaratie van een functie zonder argument en retourneert een X. De vorm ()is toegestaan in bepaalde andere initialisatiecontexten
([expr.new], [expr.type.conv], [class.base.init]). — eindnoot ]

Other episodes