好的,我将我的问题简化为看起来非常愚蠢的问题,但我根本无法理解为什么会这样:
#include <iostream>
class ABC{
public:
void Print() { std::cout<<"ABC_TEST!\n"; }
};
int main(){
Print();
return 0;
}
给我:错误:标识符“打印”未定义提前谢谢!
它应该是这样的:
#include <iostream>
class ABC{
public:
void Print() { std::cout<<"ABC_TEST!\n"; }
};
int main(){
ABC abc;
abc.Print();
return 0;
}
您需要先创建一个类型的对象,ABC
然后才能调用实例方法(或非静态的成员函数)
或者,Print()
可以是静态函数,您将能够使用::
操作员调用它。
class ABC {
public:
static void Print() { std::cout << "ABC_TEST\n"; }
};
int main()
{
ABC::Print();
return 0;
}
最重要的是,Print()
也可以是一个全局函数:
void Print()
{
std::cout << "ABC_TEST\n" ;
}
int main()
{
Print();
return 0;
}
Print()
是 的成员函数ABC
,因此您只能在 的实例上调用它ABC
:
ABC abc;
abc.Print();
作为一个完全不相关的注释,在 C++0
中隐含了一个带值的返回,所以没有必要写return 0
.
Print()
是您的 ABC 类的成员函数,您需要一个对象来调用它:
int main()
{
ABC abc; // This creates an instance of ABC
abc.Print();
// ^^^^
// This invokes member function `Print()` on the object abc.
return 0;
}
的地址abc
将作为隐式第一个参数传递给 function Print()
:该参数将在内部Print()
(更一般地,在调用的成员函数内部)作为this
指针访问。
如果您尝试将Print()
其作为非成员自由函数调用,则不会this
传递任何隐式指针,编译器抱怨它是有道理的。
如果您希望能够以Print()
您的方式调用,您应该将其设为非成员函数:
void Print() { std::cout<<"ABC_TEST!\n"; }
int main()
{
Print(); // This is fine now!
}