所以我有这样的事情:
struct FoodType {
union {
int fat = 2;
} Apple;
union {
int fat = 3;
} Banana;
} FoodType;
我想编写一个带有"未知" FoodType作为参数。
void eatFood(FoodType type) { /* do something */ }
如何实施?
答案 0 :(得分:2)
您在问题中提供的枚举解决方案的替代方法是实例化:
#include <iostream>
struct FoodType {
FoodType(int f) : fat(f) {}
int getFat() { return fat; }
int fat;
};
void eatFood(const FoodType& type) { std::cout << "I ate " << type.getFat() << " grams of fat\n"; }
int main() {
FoodType apple(2);
eatFood(apple);
FoodType banana(3);
eatFood(banana);
}
或者,对于更复杂的情况,可以使用多态,但这里似乎有点矫枉过正:
#include <iostream>
struct FoodType {
virtual int getFat() const = 0;
};
struct Apple: FoodType {
int getFat() const { return 2; }
};
struct Banana: FoodType {
int getFat() const { return 3; }
};
void eatFood(const FoodType& type) { std::cout << "I ate " << type.getFat() << " grams of fat\n"; }
int main() {
Apple apple;
eatFood(apple);
Banana banana;
eatFood(banana);
}
答案 1 :(得分:1)
这是你之后的事吗?
struct Food {
enum class Type { Apple, Banana };
int fat = 2;
Type type = Apple;
};
您可以在此处指定类型,也可以存储fat
值。
在问题代码中,有union
个成员。 union
需要多个成员才有用,成员存储在同一个内存地址中,因此您当时只能使用其中一个成员。两个工会都声明了一个具有相同名称和功能的变量,在我看来,你只需要其中一个。
但是,如果你有一些更复杂的想法,并且你真的需要一个union
,那么你应该尝试这样的事情:
struct Food {
enum class Type { Apple, Banana };
Type type = Apple;
union {
int banana;
double apple;
};
};
Food food;
food.type = Food::Type::Apple;
food.apple = 2;
在这里,您可以使用banana
元素或apple
元素,并且您使用type
元素来了解要使用的元素。
但是如果你需要它,如果你的编译器还没有支持它,你最好还是使用新的std::variant
(或boost :: variant)。
答案 2 :(得分:1)
根据您的评论判断,您需要枚举。 C ++有枚举:
enum FoodType
{
Apple,
Banana
};
void EatFood(const FoodType & foodType)
{
switch (foodType)
{
case Apple:
/* do something */
break;
case Banana:
/* do something */
break;
default:
/* handle invalid value */
break;
}
}
如果您需要这些整数值,请执行以下操作:
enum FoodType
{
Apple=2,
Banana=3
};
如果您想要严格打字,请执行以下操作:
enum class FoodType
{
Apple=2,
Banana=3
};
(然后在EatFood中你必须使用FoodType :: Apple和FoodType :: Banana。)