我有一个存储类.这类成员经常被修改.
每次修改成员时,我都想保存类的状态(克隆类实例并保存它).
所以我想创建一个新类,它将保存这些状态.
例如:
假设我在文件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类是一个可以在所有类/包中访问的主类.为了最大限度地减少代码中的更改,我希望StorageHistory与Storage类相结合.
>由于创建了多个存储实例,因此StorageHistory不能是静态或单例.
问题:
>无法编译此代码. storage.h需要在storagehistory.h之前编译,反之亦然
>如果StorageHistory无法存储在Storage类中,那么我该保留它吗?谁是这堂课的老板?
需要帮助来定义这两个类别之间的联系?
最佳答案 首先:除非您定义纯数据结构,否则不要公开数据成员.然后:Int不是C类型.
现在回答您的问题:您可以使用前向声明.由于StorageHistory直接在Storage中使用,因此无法进行前向声明,但Storage仅在StorageHistory中的模板数据成员(即std :: vector)中使用,如果该模板仅声明为存储,则该模板不需要存储的定义一个变量.只有在使用向量方法时才需要定义.
所以这是解开的代码:
StorageHistory.h
#include <vector>
class Storage;
class StorageHistory
{
std::vector<Storage> m_history_vec;
public:
/* method declarations */
};
storage.h定义
#include "StorageHistory.h"
class Storage
{
int m_cnt;
/* <lots of other members...> */
StorageHistory m_his;
public:
/* method declarations */
};
Storage.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);
/* ... */
}
StorageHistory.cpp
#include "StorageHistory.h"
#include "Storage.h"
/* ... StorageHistory method definitions ... */