我有一个存储类。这个类的成员经常被修改。
每次修改成员时,我想保存类的状态(克隆类实例并保存)。
所以我想创建一个新类来保存这些状态。

例如:

假设我在文件 storage.h 中有一个 Storage 类

class Storage
{
 public:
   Int m_cnt;
   <lots of other members...>

   StorageHistory m_his;
};

和文件 storagehistory.h 中的 StorageHistory 类
class StorageHistory
{
 public:
   std::vector<Storage> m_history_vec;
};

假设:
  • StorageHistory 类应保存在 Storage 类中。原因是 Storage 类是一个可以在所有类/包中访问的主类。为了尽量减少代码中的更改,我希望将 S torageHistoryStorage 类结合起来。
  • StorageHistory 不能是静态的或单例的,因为创建了 Storage 的多个实例。

  • 问题:
  • 无法编译此代码。 storage.h 需要在 storagehistory.h 之前编译,反之亦然
  • 如果 StorageHistory 不能存储在 Storage 类中,那么我应该保留它吗?谁是这个类的所有者?

  • 需要帮助来定义这两个分类之间的联系吗?

    最佳答案

    首先:不要公开数据成员,除非你定义了一个纯数据结构。那么:Int 不是 C++ 类型。

    现在回答您的问题:您可以使用前向声明。由于 StorageHistory 直接在 Storage 中使用,所以不能前向声明,但 Storage 只用于 std::vector 中的模板数据成员(即 StorageHistory ),如果只声明为变量,该模板不需要 Storage 的定义。仅在使用 vector 方法时才需要定义。

    所以这是解开的代码:

    存储历史.h

    #include <vector>
    class Storage;
    class StorageHistory
    {
      std::vector<Storage> m_history_vec;
    public:
      /* method declarations */
    };
    

    存储.h
    #include "StorageHistory.h"
    class Storage
    {
      int m_cnt;
      /* <lots of other members...> */
      StorageHistory m_his;
    public:
      /* method declarations */
    };
    

    存储.cpp
    #include "Storage.h"
    #include "StorageHistory.h" //not necessarily needed, because implicitly included, but thats a matter of coding style
    
    /* ... Storage methods definitions ... */
    void Storage::changeVar(/*...*/)
    {
      m_his.push_back(*this);
      /* ... */
    }
    

    存储历史.cpp
    #include "StorageHistory.h"
    #include "Storage.h"
    
    /* ... StorageHistory method definitions ... */
    

    关于c++如何创建相互依赖的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16663207/

    10-09 19:53