1. ホーム
  2. c++

[解決済み] エラーです。C2228: ''の左側にはクラス/構造体/ユニオンが必要です。

2022-03-13 15:55:05

質問

私は長い間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();
     }

}

で、mainにこんなのがあります。

void MainWindow::on_addEmployee_clicked()
{
    DatabaseControl myDBControl();
    myDBControl.addEmployee();
}

これは、ヘッダーファイルで書いたaddEmployeeメソッドを実行するだけだと思ったからです。しかし、コンパイルすると、Error: C2228: left of '.addEmployee' must have class/struct/union

このエラーの他の例を見てみましたが、何が問題なのかよく理解できません。C++のメソッドに対する私の誤解からきているような気がします。

解決方法は?

ここでエラーが発生しました。

DatabaseControl myDBControl();

という関数を宣言しましたね。 myDBControl を返し、引数を取らない DatabaseControl .

コンストラクタの引数を持たないオブジェクトの宣言では、引数を省略する必要があります。 () :

DatabaseControl myDBControl;

これは、"に関連するものです(ただし、正確にはありません)。 最も厄介なパース と同じ言語ルールに起因しています。 文は、そのように解析できるのであれば、関数宣言である。 .