我是Java用户很长时间用Qt学习C ++而我在理解方法如何工作方面遇到了很多麻烦。现在,我正在试图找出数据库,并试图用标题简化我的代码。通常在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'左边必须有class / struct / union
我已经查看了这个错误的其他实例,并没有真正理解错误是什么,我觉得它来自我对C ++中的方法的误解,因为我在Java中知道这样的东西可以正常工作(假设标题中的代码是正确的,它很可能不是)
答案 0 :(得分:32)
你在这里犯了一个错误:
DatabaseControl myDBControl();
您声明了一个名为myDBControl
的函数,它不带参数并返回DatabaseControl
。
没有任何构造函数参数的对象声明必须省略()
:
DatabaseControl myDBControl;
这与(但不完全是)“most vexing parse”有关,因为它是由相同的语言规则引起的,语句是函数声明,如果它们可以被解析。
答案 1 :(得分:1)
DatabaseControl myDBControl();
应该是
DatabaseControl myDBControl;
答案 2 :(得分:1)
你需要这样说:
DatabaseControl myDBControl;
myDBControl.addEmployee();
答案 3 :(得分:0)
支持接受的答案。
来自dcl.init#11:
一个对象,其初始化程序是一组空的括号,即()
,应进行值初始化。
[注意:由于初始化程序的语法不允许
()
,X a();
不是
class X
的对象的声明,而是。{ 声明函数不带参数并返回X 。在某些其他初始化上下文中允许使用表单()
([expr.new],[expr.type.conv],[class.base.init])。 - 结束说明]