两个依赖的类c++

  • 本文关键字:c++ 依赖 两个 c++
  • 更新时间 :
  • 英文 :


我创建了两个相互依赖的类:ClassA和ClassB。我对ClassB进行了原型化,这样编译器就会知道有可用的ClassB。先编译了ClassA,然后编译了ClassB。所以我假设下面的代码可以工作,但编译器说ClassB是未定义的,尽管我对它进行了原型化。现在的问题是……为什么它会给出这个错误?

#include <iostream>
using namespace std;
class ClassB;
class ClassA{
public:
    ClassA():x(50){}
    void printClassB(ClassB input){
        cout << input.y << endl;
    }
    friend class ClassB;
private:
    int x;
};
class ClassB{
public:
    ClassB(): y(100){}
    void printClassA(ClassA input){
        cout << input.x << endl;
    }
    friend class ClassA;
private:
    int y;
};

int main()
{
    ClassA a;
    ClassB b;
    b.printClassA(a);
    a.printClassB(b);
    cin.ignore();
}

若要使ClassA使用ClassB,则必须完全定义ClassB。既然情况正好相反,你就不能真的那样做。

可以使用指针引用ClassA中的ClassB,然后在定义数据后使用ClassB中的数据。

class ClassB;
class ClassA{
public:
    void printClassB(ClassB& input);
    ...
};
class ClassB { ... };
void ClassA::printClassB(ClassB& input)
    cout << input.y << endl;
}

ClassB在编译ClassA时是未声明的,而不是定义的,因此在printClassB函数中,编译器不知道ClassB成员y。将函数从类中移出,以便在两个类都完全定义的地方进行编译:

class ClassA{
public:
    ClassA():x(50){}
    void printClassB(ClassB input);
friend class ClassB;
private:
    int x;
};
class ClassB{
public:
    ClassB(): y(100){}
    void printClassA(ClassA input);
friend class ClassA;
private:
    int y;
};
inline void ClassA::printClassB(ClassB input){
    cout << input.y << endl;
}
inline void ClassB::printClassA(ClassA input){
    cout << input.x << endl;
}

最新更新