1

好的,我将我的问题简化为看起来非常愚蠢的问题,但我根本无法理解为什么会这样:

#include <iostream>
class ABC{
public:
    void Print() { std::cout<<"ABC_TEST!\n"; }
};

int main(){
    Print();
    return 0;
}

给我:错误:标识符“打印”未定义提前谢谢!

4

3 回答 3

3

它应该是这样的:

#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;
}
于 2013-03-10T21:42:51.247 回答
1

Print()是 的成员函数ABC,因此您只能在 的实例上调用它ABC

ABC abc;
abc.Print();

作为一个完全不相关的注释,在 C++0中隐含了一个带值的返回,所以没有必要写return 0.

于 2013-03-10T21:42:10.937 回答
1

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!
}
于 2013-03-10T21:42:18.803 回答