在.h文件中使用类

时间:2016-01-04 21:16:26

标签: c++ file class header-files

好的,有点上下文,我正在创建一个添加和删除文件中项目的系统。 我首先创建了一个itemHandler类来处理我所拥有的Item类的所有实例。这很好。 然后我创建了一个表单来输入值,这些值将用于输入创建新项目的值,该类名为addItemForm。 所有类都有各自的.h和.cpp文件(例如item/itemHandler/addItemForm.h& .cpp)。

我首先在update类中编写了名为itemHandler的函数。

void itemHandler::update(int x, int y, SDL_Event e, addItemForm &tmpForm)
{
    if( tmpForm.isViewable == false)
    {
        if(exportButton.mouseAction(x, y, e))
        {
            //This funtion is pretty self-explanatory. It exports the item's quantity, name and unit to the inventory file in the format: ITEMNAME[ITEMQUANTITY]ITEMUNIT;
            exportItemsToFile();
        }
        if(reloadButton.mouseAction(x, y, e))
        {
            //This reloads the item to the vector list 'itemList'. This is done in order to delete items as the list must be refreshed.
            reloadItems();
        }
        for(int i = 0; i < itemNumber; i++)
        {
            //This FOR loop runs the update function for each item. This checks if any action is being preformed on the item, e.g. changing the item quantity, deleting the item etc
            itemList.at(i).update( x, y, e );
        }
        //The 'checking' for if the user wants to delete an item is done within the function 'deleteItem()'. This is why there is not IF or CASE statement checking if the user has requested so.
        deleteItem();
    }


}

此功能完全正常。没有错误,如预期,没有警告,没有。

现在跳到我想要做同样的事情。我希望能够在itemHandler类中使用addItemForm函数。所以我写这个(在addItemForm.h):

various includes (SDL, iostream, etc)
include "itemHandler.h"
/...........
...represents everything else/
void updateText(int x, int y, SDL_Event e, itemHandler &tmpHander);

现在当我写这个,更具体地说,写#include "itemHandler.h"时,编译器MVSC ++ 2010并不喜欢它。它突然说:error C2061: syntax error : identifier 'addItemForm'并且没有编译。但是,当我注释掉itemHandler.h的include时,它就像正常一样工作。 *我将头文件包含在需要使用它们的所有地方*

为什么会发生这种情况的唯一想法是使用#include混乱,但我已经尝试清除它,但我不明白这个问题。

感谢任何帮助或见解, 感谢。

1 个答案:

答案 0 :(得分:3)

您不能itemHandler.h依赖addItemForm.h 反之亦然。

幸运的是,你不需要!

addItemForm.h中的代码并不需要完整的itemHandler定义,只知道它是一种类型。这是因为你所做的就是声明对它的引用。

因此,使用转发声明而不是包含整个标头:

 class itemHandler;

事实上,如果你能以相反的方式做同样的事情,那就更好了 - 保持你的头文件轻量化将减少编译时间,并减少随着你的代码库增加而进一步出现依赖性问题的风险。

理想情况下,您只需要在.cpp个文件中真正包含每个标头。