簡體   English   中英

兩個類相互引用

[英]two classes referencing each other

假設有兩個類,它們需要彼此: 容器項目 容器創建類項的實例。 項的每個實例都包含一個類容器的實例,只需要調用類容器的方法method_called_by_item 容器需要查看類項的所有字段。

問題是前向聲明:我想在item.h中有一個前向聲明,這樣類可以有一個容器作為字段並調用方法method_called_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.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);
}

在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"

您已經向item.h添加了前向聲明,因此您需要做的就是將以下行添加到item.cpp中

#include "container.h"

container.h已經包含item.h所以您不必進行任何額外的變化,但作為馬哈茂德·法耶茲指出,你可以有添加前向聲明為好。 這將消除通常需要的頭文件的依賴性 - 它可以減少大型項目的構建時間,並允許頭文件“獨立”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM