web-dev-qa-db-ja.com

エラー:C2228: ''の左にはクラス/構造体/ユニオンが必要です

私は長い間Java QtでC++を学習しているユーザーで、メソッドがどのように機能するかを理解するのに苦労しています。現在、データベースを理解しようとしています。コードをヘッダーで簡素化します。通常Javaに、私が望むものを実行するvoidメソッドを持つDatabaseControlというクラスがあります。たとえば、データベースに従業員を追加します。 「今やっています。次のようなことをしてクラスをインスタンス化します

DatabaseControl myDBControl = new DatabaseControl();

そして、メソッドを実行します

myDBControl.addEmploye();

ユーザーが従業員に関する情報(名前、部門など)を入力するための一連の入力ボックスが表示されます。

それでは、C++に移りましょう。ヘッダーがあります

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'の左にclass/struct/unionが必要です

私はこのエラーの他のインスタンスを見てきましたが、実際に何が間違っているのか正確に理解していません。C++のメソッドの誤解から来ていると思います。なぜなら、Java問題なく動作します(ヘッダー内のコードが正しいと仮定すると、正しくない可能性があります)

22
Lighthat

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

DatabaseControl myDBControl();

myDBControlという関数を宣言しました。引数を取らず、DatabaseControlを返します。

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

DatabaseControl myDBControl;

これは、「 most vexing parse 」に関連しています(正確ではありません)。これは、ステートメントが可能な場合は関数宣言であるという同じ言語ルールが原因です。解析済み

DatabaseControl myDBControl();

あるべき

DatabaseControl myDBControl;
1
Digital_Reality

あなたはこれを言う必要があります:

 DatabaseControl myDBControl;
 myDBControl.addEmployee();
1
Kerrek SB

受け入れられた答えを支持して。

dcl.init#11 から:

初期化子が括弧の空のセット、つまり()であるオブジェクトは、値で初期化されます。

[注意:()は初期化子の構文では許可されていないため、

X a();

class Xのオブジェクトの宣言ではなく、引数を取らずXを返す関数の宣言です。 ()という形式は、他の特定の初期化コンテキスト([expr.new]、[expr.type.conv]、[class.base.init])で許可されています。 —メモを終了]

0
Joseph D.