我确定有一个简单的解释,但我不能在其他功能下面调用函数。
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();
}
答案 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,方法通常意味着一个类内函数。