Ошибка: C2228: слева от '' должен быть класс/структура/объединение

Я долгое время изучал Java на С++ с Qt, и у меня много проблем с пониманием того, как работают методы. Прямо сейчас, я пытаюсь выяснить базы данных и попытался упростить мой код с заголовком. Обычно в Java я бы просто получил класс под названием DatabaseControl с методом void, который выполнял бы все, что я хотел. Например, добавление сотрудника в базу данных, как я делаю сейчас. Я бы создавал экземпляр класса, делая что-то вроде

DatabaseControl myDBControl = new DatabaseControl();

а затем выполните метод с

myDBControl.addEmploye();

который приведет к появлению серии полей ввода для пользователя, чтобы ввести информацию о сотруднике - имя, отдел и т.д.

Итак, теперь переходим к С++. У меня есть заголовок

class DatabaseControl
{
public:
    DatabaseControl();
    ~DatabaseControl();

    //Methods
    void addEmployee();
};

У меня нет параметров в моих конструкторах, потому что все, что я хочу сделать, это вызвать метод "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 должен быть класс /struct/union

Я просмотрел другие экземпляры этой ошибки и не совсем понимаю, что именно не так, и я чувствую, что это происходит из-за моего непонимания методов на С++, потому что я знаю в Java, что-то вроде этого будет работать без проблем (предполагается код в заголовке правильный, что очень хорошо не может быть)

Ответ 1

Вы сделали ошибку здесь:

DatabaseControl myDBControl();

Вы объявили функцию с именем myDBControl без аргументов и возвращаете DatabaseControl.

Объявления объекта без каких-либо аргументов конструктора должны опускать ():

DatabaseControl myDBControl;

Это связано с (но не совсем) "самым неприятным анализом", поскольку оно вызвано тем же языком, что и заявления являются декларациями функций, если они может быть таким образом проанализирован.

Ответ 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]). - конец примечания]