繁体   English   中英

错误:C2228:“”的左侧必须具有class / struct / union

[英]Error: C2228: left of '' must have class/struct/union

我有很长时间的Java用户使用Qt学习C ++,但在理解方法的工作方式时遇到了很多麻烦。 现在,我正在尝试找出数据库,并尝试使用标头简化我的代码。 通常,在Java中,我只有一个名为DatabaseControl的类,该类具有可以执行我想要执行的操作的void方法。 例如,像我现在所做的那样,将一个雇员添加到数据库中。 我会通过做类似的事情来实例化课程

DatabaseControl myDBControl = new DatabaseControl();

然后执行

myDBControl.addEmploye();

这将弹出一系列输入框,供用户输入有关员工的信息-姓名,部门等。

因此,现在转到C ++。 我有我的标头

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

    //Methods
    void addEmployee();
};

我的构造函数中没有任何参数,因为我想要做的就是在主程序中调用“ addEmployee”方法,如上所示。 在同一个头文件中,我在类声明下面

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

}

然后在我的主要我有:

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

我希望它只运行我在头文件中编写的addEmployee方法。 但是,当我编译时,出现错误错误:C2228:“。addEmployee”的左侧必须具有class / struct / union

我查看了此错误的其他实例,但并没有真正确切地了解出了什么问题,而且我认为这是由于我对C ++中的方法的误解所致,因为我知道在Java中类似的东西可以正常工作(假定代码在标头是正确的(很可能不是)

您在这里犯了一个错误:

DatabaseControl myDBControl();

您声明了一个名为myDBControl的函数,该函数myDBControl带任何参数并返回DatabaseControl

没有任何构造函数参数的对象声明必须省略()

DatabaseControl myDBControl;

这与( 最不精确的 )“ 最烦人的解析 ”有关,因为它是由相同的语言规则导致的, 如果可以语句进行解析,它们就是函数声明

DatabaseControl myDBControl();

应该

DatabaseControl myDBControl;

您需要这样说:

 DatabaseControl myDBControl;
 myDBControl.addEmployee();

支持接受的答案。

来自dcl.init#11

一个其初始值设定项是一个空括号集合(即()应进行值初始化。

[注意:由于初始化程序的语法不允许()

 X a(); 

不是class X对象的声明 ,而是不带参数并返回X的函数声明 某些其他初始化上下文([expr.new],[expr.type.conv],[class.base.init])中允许使用()形式。 —尾注]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM