1

簡単な説明があると思いますが、他の関数の下で関数を呼び出すことはできません。

int methodOne() {
    std::cout << "Method 1";
    methodTwo(); //Problem is here. I cannot call methodTwo()
    return 0;
}

int methodTwo() {
    std::cout << "Method 2";
    return 0;
}

int main() {
    methodOne();
}
4

5 に答える 5

10
int methodTwo();  // forward declaration

int methodOne() {
    std::cout << "Method 1";
    methodTwo(); // works!
    return 0;
}

int methodTwo() {
    std::cout << "Method 2";
    return 0;
}

C++ コンパイラはバックトラックしません。関数は、使用する前に宣言する必要があります。リンカは後で詳細を把握できますが、最初にコンパイラに関数について知らせる必要があります。これが前方宣言の目的です。

于 2012-11-15T01:22:25.343 に答える
5

MethodOne の宣言の前に MethodTwo を宣言するだけです。

于 2012-11-15T01:22:16.787 に答える
3

最初に、用語についてのポイント: C++ では、メソッドという用語は独立した関数には適用されず、メンバー関数にのみ適用されます。

以下に示すように、あなたの例は独立した関数に対してのみ意味があるため、「メソッド」という用語を使用するとかなり誤解を招きます。

C++ では、何かを使用する前に宣言する必要があります。

フリー関数の場合、これは、宣言される前のテキスト内のポイントで関数を呼び出すことができないことを意味します。

void foo() { bar(); }   // NO GOOD!
void bar() {}

ただし、次のようなクラス宣言を記述すると、

struct S
{
    void foo() { bar(); }
    void bar() {}
};

コンパイラは(本質的に)それをに変換します

struct S
{
    inline void foo();
    inline void bar();
};

inline void S::foo() { bar(); }
inline void S::bar() {}

この変換されたより基本的なコードでわかるように、bar宣言される前に呼び出されません。

つまり、コンパイラは、使用する前に何かを知る必要があります。

最後に、独立した関数の場合、問題を修正する 1 つの方法は、宣言を並べ替えることです。また、別の方法は、前方宣言と呼ばれる関数を最初に宣言することです。bar

前方宣言を持つことは、前方宣言と定義の両方を維持する必要があることを意味するため、通常、並べ替えにより作業が節約されます。初心者は、前方宣言が意図した定義と異なる状況に陥ることがよくあり、謎のコンパイル エラーが発生します。一般に、定義を並べ替えるだけで、これらすべてを回避するのが最善です。bar最初に、 によって呼び出されるためfooです。

于 2012-11-15T01:25:12.917 に答える
2

次のように前方宣言を追加します。

int methodTwo(); //Forward declaration

int methodOne() {
    std::cout << "Method 1";
    methodTwo(); //Problem is here. I cannot call methodTwo()
    return 0;
}

int methodTwo() {
    std::cout << "Method 2";
    return 0;
}

int main() {
    methodOne();
}
于 2012-11-15T01:23:59.580 に答える
1

呼び出している関数の前に関数が宣言されていない場合は、関数を前方宣言する必要があります。

int FunctionTwo();

ところで、メソッドは通常、クラス内関数を意味します。

于 2012-11-15T01:23:18.603 に答える