C ++无法调用某些函数

时间:2012-11-15 01:20:28

标签: c++ function call

我确定有一个简单的解释,但我不能在其他功能下面调用函数。

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();
}

5 个答案:

答案 0 :(得分:8)

int methodTwo();  // forward declaration

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

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

C ++编译器不会回溯。您必须在使用之前声明一个函数。链接器稍后可以弄清楚细节,但是你必须先让编译器知道这个函数,这就是前向声明的用途。

答案 1 :(得分:5)

您只需要在MethodOne的声明

之前转发声明MethodTwo

答案 2 :(得分: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调用。

答案 3 :(得分: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();
}

答案 4 :(得分:1)

如果在你正在调用的函数之前没有声明它们,你需要转发声明任何函数。

int FunctionTwo();

和btw,方法通常意味着一个类内函数。