两个类相互引用

时间:2013-05-25 21:06:57

标签: c++ forward-declaration

假设有两个类需要彼此:容器。 类容器创建类 item 的实例。类 item 的每个实例都包含类容器的实例,并且只需要调用类容器的方法 method_called_by_item 。类容器需要查看类 item 的所有字段。

问题是前向声明:我希望在 item.h 中有一个前向声明,以便类 item 可以有一个容器< / em> as field并调用方法 method_called_by_item 。我该怎么做?

Class container ,用于创建项目。

// container.h
#ifndef CONTAINER_H
#define CONTAINER_H

#include "item.h"

class container{

public:
  item * create_item();
  void method_called_by_item(item * i);
};

#endif //CONTAINER_H

实施:

// container.cpp
#include "container.h"

item * container::create_item(){
  return new item(this);
}

void container::method_called_by_item(item * i){
  // do stuff with item
}

,需要调用容器的一个方法:

// item.h
#ifndef ITEM_H
#define ITEM_H

#include <iostream>

class container;

class item{

public:
  item(container * c);
  void do_something();
  container * c;
};

#endif //ITEM_H

实施:

// item.cpp
#include "item.h"

item::item(container * c){
  this->c = c;
}
void item::do_something(){
  this->c->method_called_by_item(this);
}

2 个答案:

答案 0 :(得分:8)

在container.h中

class item; // do not include the item.h

在container.cpp中

#include "item.h"
在item.h中

class container; // do not include container.h

在item.cpp中

#include "container.h"

答案 1 :(得分:3)

您已将前向声明添加到 item.h ,因此您需要做的就是将以下行添加到 item.cpp

#include "container.h"

container.h 已包含 item.h ,因此您 无法进行任何其他更改,但是Mahmoud Fayez指出你也可以在那里添加前瞻声明。这将消除通常需要的头文件的依赖性 - 它可以减少大型项目的构建时间,并允许头文件“独立于它”。