#include <iostream>
#include <cstring>
using namespace std;
class Obj;
class Test {
friend class Obj;
public:
Test()
{
}
~Test()
{
}
void foo()
{
//print();
//Obj::print();
//Obj x;
//x.print();
}
};
class Obj {
public:
void print()
{
cout << "print here" << endl;
}
};
int main()
{
Test test;
test.foo();
return 0;
}
快速提问,如何在Test :: foo()中调用正确的打印方式?
答案 0 :(得分:5)
您需要在 Obj
的定义之后定义成员函数:
class Test {
public:
void foo();
};
class Obj {
public:
void print() { }
};
void Test::foo() {
Obj o;
o.print();
}
答案 1 :(得分:2)
正如james所提到的,你应该在Obj的定义之后定义成员函数。你也在调用Obj :: print,但是print不是静态成员函数,所以你必须在Obj本身的实例上调用它。
如果你真的希望print成为静态成员,请声明它。
class Obj {
public:
static void print(){ blah }
}
此外,您无需让Obj成为朋友以访问其公共方法。
OP也可以定义“正确的方式”,我假设你想要它是一个静态成员函数,如果你想要每个Test实例的一个Obj实例,james的答案是正确的。
已更新 OP,根据你的评论,你必须在测试中使用Obj以及打印之前使用它。这可以通过多种方式实现:
以下工作正常:
#include <iostream>
#include <cstring>
using namespace std;
class Obj {
public:
static void print()
{
cout << "print here" << endl;
}
};
class Test {
public:
Test()
{
}
~Test()
{
}
void foo()
{
Obj::print();
}
};
int main()
{
Test test;
test.foo();
return 0;
}
然而,除了最微不足道的案例之外,将声明与定义分开总是更好(在我看来)。