c++,两个类相互定义了对方类的指针类型的成员变量,现在如果要要使用其方法怎么用?
时间: 2024-03-24 22:40:25 浏览: 49
这种情况下,两个类相互定义了对方类的指针类型的成员变量,就会出现循环依赖的问题。解决这个问题的方法通常是使用前向声明(forward declaration)或者将其中一个类的定义放到另一个类的定义后面。
如果你使用前向声明,需要在类定义之前声明该类的名称,然后在使用该类的指针类型成员变量时,使用指针类型的前向声明即可。例如:
```c++
// forward declaration of class B
class B;
// class A
class A {
public:
void doSomethingWithB();
private:
B* b_ptr_;
};
// class B
class B {
public:
void doSomethingWithA();
private:
A* a_ptr_;
};
// implementation of A::doSomethingWithB()
void A::doSomethingWithB() {
b_ptr_->doSomethingWithA();
}
// implementation of B::doSomethingWithA()
void B::doSomethingWithA() {
a_ptr_->doSomethingWithB();
}
```
在上面的代码中,我们使用前向声明来声明了类B,然后在类A中使用了B的指针类型成员变量,同时在类B中使用了A的指针类型成员变量,最后在类A和类B的实现中分别调用了对方的方法。
另一种解决循环依赖的方法是,将其中一个类的定义放到另一个类的定义后面,例如:
```c++
// class A
class A {
public:
void doSomethingWithB();
private:
class B* b_ptr_;
};
// class B
class B {
public:
void doSomethingWithA();
private:
class A* a_ptr_;
};
// implementation of A::doSomethingWithB()
void A::doSomethingWithB() {
b_ptr_->doSomethingWithA();
}
// implementation of B::doSomethingWithA()
void B::doSomethingWithA() {
a_ptr_->doSomethingWithB();
}
// define class B after class A
class A::B {
public:
void doSomethingWithA(A* a_ptr) {
a_ptr_ = a_ptr;
}
private:
class A* a_ptr_;
};
```
在上面的代码中,我们将类B的定义放到了类A的定义后面,然后在类A中使用了B的指针类型成员变量,并在类B的定义中使用了A的指针类型成员变量。最后在类A和类B的实现中分别调用了对方的方法。需要注意的是,在类B的定义中,我们需要使用 `class A::B` 来表示类B的完整名称。
阅读全文