错误:C2228:''必须有class / struct / union

时间:2014-01-01 17:26:38

标签: c++ qt sqlite

我是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中知道这样的东西可以正常工作(假设标题中的代码是正确的,它很可能不是)

4 个答案:

答案 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])。 - 结束说明]