【问题标题】:Error: C2228: left of '' must have class/struct/union错误:C2228:“”左侧必须有类/结构/联合
【发布时间】:2014-01-19 05:00:55
【问题描述】:

我是一名长期使用 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 方法。但是,当我编译时,我收到错误 Error: C2228: left of '.addEmployee' must have class/struct/union

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

【问题讨论】:

  • 我注意到了,这就是我问这个问题的原因。
  • @Lighthat:这不是一种高效或高效的语言学习方式。系统地去做。 (尽管你在几天前发现 Python 和 C++ 都有一个关键字 int 并且对它在两种语言中没有做同样的事情感到愤怒。)
  • @KerrekSB:我wouldn't say he was "furious",正是……
  • @JoachimPileborg:这不是最令人烦恼的解析,尽管它是相关的。
  • 我之所以问它并提到 Java,是为了准确解释我想要做什么,因为我不确定我的措辞是否正确,我想看看如何做C++ 中相同的东西(或类似的东西),我从未声称 Java 和 C++ 是相似的。

标签: c++ qt sqlite


【解决方案1】:

你在这里犯了一个错误:

DatabaseControl myDBControl();

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

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

DatabaseControl myDBControl;

这与(但不完全是)“most vexing parse”有关,因为它是由相同的语言规则引起的,即如果可以这样解析,语句就是函数声明。 p>

【讨论】:

    【解决方案2】:
    DatabaseControl myDBControl();
    

    应该是

    DatabaseControl myDBControl;
    

    【讨论】:

      【解决方案3】:

      你需要这样说:

       DatabaseControl myDBControl;
       myDBControl.addEmployee();
      

      【讨论】:

        【解决方案4】:

        支持已接受的答案。

        来自dcl.init#11

        初始化器为空括号集的对象,即(),应进行值初始化。

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

        X a();
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-03
          • 1970-01-01
          相关资源
          最近更新 更多