c ++前向声明

时间:2011-02-07 00:01:04

标签: c++

#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()中调用正确的打印方式?

2 个答案:

答案 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以及打印之前使用它。这可以通过多种方式实现:

  • 在测试
  • 之前移动整个类Obj defintion(和声明)
  • 使用类定义声明Obj的方法,并在以后定义它们。
  • 按照James的帖子(在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;
}

然而,除了最微不足道的案例之外,将声明与定义分开总是更好(在我看来)。