【问题标题】:two classes referencing each other相互引用的两个类
【发布时间】:2013-05-25 21:06:57
【问题描述】:

假设有两个类,它们相互需要:container 和 item。 container 类创建了item 类的实例。 item 类的每个实例都持有一个container 类的实例,只需要调用container 类的method_call_by_item 方法即可. container 类需要查看 item 类的所有字段。

问题是前向声明:我想在 item.h 内部有一个前向声明,以便类 item 可以有一个 container 作为字段并调用方法method_call_by_item。我该怎么做?

类容器,创建项目。

// 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,需要调用容器的一种方法:

// 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);
}

【问题讨论】:

    标签: c++ forward-declaration


    【解决方案1】:

    在容器.h中

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

    在容器.cpp中

    #include "item.h"
    

    在 item.h 中

    class container; // do not include container.h
    

    在 item.cpp 中

    #include "container.h"
    

    【讨论】:

      【解决方案2】:

      您已经将前向声明添加到 item.h,所以您只需将以下行添加到 item.cpp。

      #include "container.h"
      

      container.h 已经包含 item.h 所以你没有有做任何额外的改变,但Mahmoud Fayez指出您也可以在那里添加前向声明。这将消除通常需要的对头文件的依赖——它可以减少大型项目的构建时间,并允许头文件“独立存在”。

      【讨论】:

      • 现在,既然这些类相互引用,那么在使用 shared_ptr 时如何调用析构函数?
      • @James 您需要手动中断循环引用或酌情使用std::weak_ptr。
      • 显然我尝试了weak_prt,发现没有-> 运算符,所以我无法访问任何成员函数。但我弄清楚发生了什么。我做了更多的研究,发现我实际上应该使用标准指针来传递函数并维护对父/子类的引用。一旦我这样做了,析构函数就开始被调用。
      • @James 没有-&gt; 运算符,原因是 good - 你不知道弱指针是否引用了有效对象。您需要调用lock 以获取指向weak_ptr 的对象引用的共享指针。在这里使用原始指针是一个糟糕的想法,它违背了使用智能指针表达和管理生命周期和所有权的目的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2021-07-26
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多