0

Visual C++ を使用して単純な Windows フォーム アプリケーションをプログラミングしようとしています。

私の問題は、.cpp で関数を作成したことです。

Form1.cpp

bool function()
{
    //code
}

問題は、この関数を .h ファイルからボタンのクリックに呼び出そうとしていることです。

Form1.h

private: 
System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    bool result = function();
}

コンパイル エラーが発生しています。

onClick以前のスレッドで、「 .cpp ファイルで本体を宣言してみてください」と読みました。問題は... .cpp ファイルに正確に何を入れればよいかわかりません。

お時間をいただきありがとうございます。どんな助けでも大歓迎です。

4

2 に答える 2

2

関数を使用する前に、関数のプロトタイプを置くだけです。

bool function();
void whatever::button_click()
{
    bool result = function();
}

プロトタイプを関数の外側に表示したくない場合は、プロトタイプを関数に入れることもできます。

void whatever::button_click()
{
    bool function();
    bool result = function();
}

もちろん、.cpp ファイル内の関数がプロトタイプと一致しない場合は、リンカーエラーが発生します。

于 2013-03-19T20:53:53.350 に答える
0

ここでの問題は、なぜすべてが c++ の世界のようになっているのかを理解していないことだと思います。関数 Bar を持つクラス Foo を作成したいとしましょう。これは非常に簡単です。

class Foo
{
    void Bar(){/*code*/}
};

これで、ファイルに Foo クラスがありますが、別のファイルにある必要がある Baz クラスも必要です。Foo は移動できないので、C++ には #include システムがあります。このようにして、ファイルに Foo を入れ、別のファイルに Baz を入れても、両方を使用することができます。理論的な例は次のとおりです。

#include "Foo.h"
class Baz
{
     Foo* foo;
};

コンパイラーは次のように変換します (今のところ、Foo.h には以前に書いたものが含まれていると考えてください):

class Foo
{
    void Bar(){/*code*/}
}; 

class Baz
{
     Foo* foo;
};

しかし、これは多くの理由で非常に非効率的です。まず第一に、すべてをこのようにしておくと、コンパイラーはファイルを別の場所に #include するたびに同じものをコンパイルする必要があるため、C++ には別のメカニズムがあり、クラス Foo は別の場所に存在し、将来利用可能になるコンパイラであり、このように見えるため、C++ でクラスを作成するときは、.h ファイルを使用してどのように見えるかを記述し、実装を cpp に保持します。ファイル。この場合、次のようになります。

//Foo.h

class Foo
{
    void Bar();
}; 

//Foo.cpp
#include "Foo.h"
void Foo::Bar(){/*code*/}

//Baz
#include "Foo.h"
class Foo
{
    void Bar(){/*code*/}
};

TLDR、あなたがする必要があるのは、関数定義を削除してそのままにすることです

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e);

そしてcppファイルには

System::Void Form1::button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
    bool result = function();
}
于 2013-03-19T21:16:36.167 に答える