私は長い間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問題なく動作します(ヘッダー内のコードが正しいと仮定すると、正しくない可能性があります)
ここでエラーが発生しました:
DatabaseControl myDBControl();
myDBControl
という関数を宣言しました。引数を取らず、DatabaseControl
を返します。
コンストラクター引数のないオブジェクト宣言では、()
を省略する必要があります。
DatabaseControl myDBControl;
これは、「 most vexing parse 」に関連しています(正確ではありません)。これは、ステートメントが可能な場合は関数宣言であるという同じ言語ルールが原因です。解析済み。
DatabaseControl myDBControl();
あるべき
DatabaseControl myDBControl;
あなたはこれを言う必要があります:
DatabaseControl myDBControl;
myDBControl.addEmployee();
受け入れられた答えを支持して。
dcl.init#11 から:
初期化子が括弧の空のセット、つまり()
であるオブジェクトは、値で初期化されます。
[注意:
()
は初期化子の構文では許可されていないため、X a();
class X
のオブジェクトの宣言ではなく、引数を取らずXを返す関数の宣言です。()
という形式は、他の特定の初期化コンテキスト([expr.new]、[expr.type.conv]、[class.base.init])で許可されています。 —メモを終了]