错误:C2228:左侧必须具有类/结构/联合
Error: C2228: left of '' must have class/struct/union
我是一名长期使用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])--尾注]
- 如何将结构/联合数组的成员传递到函数中
- 错误 C2228 左侧'.setDay'必须具有类/结构/联合
- 在C++中为结构(联合)创建构造函数
- '.expression'左边必须有类/结构/联合
- C++错误 C2227:'->looseHealth'左侧必须指向类/结构/联合/泛型类型
- C 结构/联合到C#结构
- C++ 使用比较 - '.compare'左侧必须具有类/结构/联合
- 表达式必须具有类类型,'.x'左侧必须具有类/结构/联合
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- .BEGIN的左侧必须具有类/结构/联合
- 我的测试用例错误类/结构/联合
- C++ 异常情况下的错误 C2228(".val"的左侧必须具有类/结构/联合)
- 错误 C2228:".x"的左侧必须具有类/结构/联合
- 错误:C2228:左侧必须具有类/结构/联合
- 错误 C2228:".printStats"的左侧必须具有类/结构/联合
- '.getDrinkPrice'左边必须有类/结构/联合
- 通过反射在XML中的C/C++头文件中定义的可视化嵌套结构/联合
- 错误 C228:"必须多次具有类/结构/联合"的左侧
- 正在分析XML中C/C++头文件中定义的嵌套结构/联合
- 错误 C2228:'.Alloc'左侧必须具有类/结构/联合