前向声明枚举类不起作用
Forward Declaring enum class not working
In State.h 我有
enum class StateID : unsigned int;
在州.cpp我有
enum class StateID : unsigned int
{
NullID = 0,
MainMenuID,
GamePlayID,
};
问题是任何包含 State.h
的类都有前向声明,但我不能在任何 cpp 文件中使用任何 enum
值,除了 States.cpp
(定义它(,就像 StateID::MainMenuID
一样。 错误说...
/home/lee/Projects/SuddenAwakening/Source/Game.cpp:24:错误:"MainMenuID"不是"StateID"的成员
我正在运行LinuxMint15KDE,g ++ 4.7,并且我在nullptr,unique_ptr等其他部分中使用c ++ 11功能,所以并不是我忘记了c ++ 11的编译器标志。
那是因为只有国家.cpp知道enum class ID
内部存在哪些成员。
包含 States.hpp 的文件只知道enum class ID
是 unsigned int
的大小,仅此而已。
您需要在标头中提供枚举值,以便任何需要知道枚举值的文件(例如 MainMenuID
(有可用的。
您可以创建一个单独的标头来转发,也许称为StateFwd.hpp,然后将State重命名为State.cpp为State.hpp。
在何处/如何转发声明的示例
在评论中的讨论之后,我用一个例子更新了我的答案。
水果.hpp
任何选择包含此标题的人都会知道存在什么样的水果。
#ifndef FRUIT_HPP
#define FRUIT_HPP
enum class Fruit
{
APPLE,
ORANGE,
BANANA
};
#endif
村庄.hpp
村里到处都是被对水果的渴望所驱使的人。
#ifndef VILLAGE_HPP
#define VILLAGE_HPP
enum class Fruit;
namespace farmer
{
bool is_fruit_for_sale(Fruit fruit);
float get_cost_of_fruit(Fruit fruit);
}
namespace blind_but_greedy_merchant
{
bool sell_fruit(Fruit fruit, float money);
}
namespace peasant
{
inline bool buy_fruit(Fruit fruit, float money)
{
return blind_but_greedy_merchant::sell_fruit(fruit, money);
}
}
#endif
农民.cpp
这个农民只种苹果和橙子,所以他从不出售香蕉
#include "fruit.hpp"
namespace farmer
{
bool is_fruit_for_sale(Fruit fruit)
{
switch ( fruit ) {
case Fruit::APPLE:
case Fruit::ORANGE:
return true;
case Fruit::BANANA:
return false;
}
return false;
}
float get_cost_of_fruit(Fruit fruit)
{
switch ( fruit ) {
case Fruit::APPLE:
return 1.00f;
case Fruit::ORANGE:
return 2.50f;
case Fruit::BANANA:
return 200.0f;
}
return 0.0f;
}
}
商人.cpp
这个商人因贪婪而失明。他再也看不出是什么样的了他在卖水果。不过,他仍然知道如何与农民打交道,将客户要求传递给农民,同时增加可观的利润所有水果的余量。这就是为什么不包括fruit.hpp的原因。
#include "village.hpp"
namespace blind_but_greedy_merchant
{
bool sell_fruit(Fruit fruit, float money)
{
if ( !farmer::is_fruit_for_sale(fruit) ) {
return false;
}
float inflatedcost = farmer::get_cost_of_fruit(fruit) * 3;
if ( money < inflatedcost ) {
return false;
}
return true;
}
}
示例.cpp
这把所有的东西都拉到了一起。在我们的例子中,我们希望农民去买一些水果。我们确切地知道我们想要什么样的水果;一根香蕉。因此,我们需要包括fruit.hpp,否则我们无法告诉农民去为我们买香蕉。
在这种情况下,只有两个人知道存在哪种水果,那就是我们(示例.cpp(和农民(farmer.cpp(。农民甚至不需要知道。这就像我们给了他一张折叠的纸,上面写着我们想要什么水果,但我们告诉他不要看它。他只是把它交给商人,商人不识字,所以他只是把它传给农民。
#include "village.hpp"
#include "fruit.hpp"
int main()
{
peasant::buy_fruit(Fruit::BANANA, 25.0f);
return 0;
}
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 按类检查枚举不起作用
- 前向声明枚举类不起作用
- 枚举子窗口不起作用,但枚举Windows可以...?
- 枚举返回类型不起作用 C [错误 C2440]