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在它被声明之前不会被调用。

简而言之,编译器在使用它之前需要知道一些东西。

最后,对于独立函数,解决问题的一种方法是重新排序声明,另一种方法是先声明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 回答