错误:C2228:左侧必须具有类/结构/联合

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

本文关键字:结构 联合 C2228 错误      更新时间:2023-10-16

我是一名长期使用Qt学习C++的Java用户,在理解方法如何工作方面遇到了很多困难。现在,我正试图弄清楚数据库,并试图用一个头来简化我的代码。通常在Java中,我只需要一个名为DatabaseControl的类,它带有一个void方法,可以执行我想要的任何内容。例如,将一名员工添加到数据库中,就像我现在所做的那样。我会实例化类,通过做一些类似的事情

DatabaseControl myDBControl = new DatabaseControl();

然后用执行该方法

myDBControl.addEmploye();

它将显示一系列输入框,供用户输入员工姓名、部门等信息。

现在转到C++。我有我的头

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

我的构造函数中没有任何参数,因为我只想在main中调用"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"的左边必须有类/结构/联合

我看过这个错误的其他例子,并没有真正理解到底出了什么问题,我觉得这是因为我对C++中的方法的误解,因为我知道在Java中这样的东西可以毫无问题地工作(假设头中的代码是正确的,但很可能不是)

您在这里犯了一个错误:

DatabaseControl 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])--尾注]