Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类枚举的正确位置_C++_Class_Enums - Fatal编程技术网

C++ 类枚举的正确位置

C++ 类枚举的正确位置,c++,class,enums,C++,Class,Enums,我认为这更像是一个风格问题,但我有一个类,它带有统计分布类型的枚举(仅在这个类中使用): 我想将DistributionType值作为构造函数的参数: Entity salesVolume = new Entity(Entity::DistributionType.NORM); 但这不起作用(我想当传递int值时它需要DistributionType?) 使用属于同一类的枚举值调用构造函数的正确方法是什么?我可以通过将字体转换为int来完成,但这看起来不是很紧。我还可以从类中排除枚举并单独定义

我认为这更像是一个风格问题,但我有一个类,它带有统计分布类型的枚举(仅在这个类中使用):

我想将DistributionType值作为构造函数的参数:

Entity salesVolume = new Entity(Entity::DistributionType.NORM);
但这不起作用(我想当传递int值时它需要DistributionType?)

使用属于同一类的枚举值调用构造函数的正确方法是什么?我可以通过将字体转换为int来完成,但这看起来不是很紧。我还可以从类中排除枚举并单独定义它(我已经看到了)——这是一种更常见的方法吗

感谢大家使用enum,这里没有“名称空间”,所以您需要:

Entity* salesVolume = new Entity(Entity::NORM);
C++11提供了“枚举类”或用于解决这种奇怪的问题。它还允许您将枚举名称用作传统枚举的“作用域”,因此您也可以这样做:

Entity* salesVolume = new Entity(Entity::DistributionType::NORM); // C++11 only

您能告诉我您遇到了什么错误吗?因为此代码应该可以工作,所以唯一的问题是:

  • 您已经将ds定义为distributionType,而它应该是distributionType(大写“D”)
  • 实体salesVolume=新实体(实体::DistributionType.NORM);应替换为
  • 实体*salesVolume=新实体(实体::实体.NORM)


    请注意sa前的“*”;esVolume。ie您必须将其声明为指针。

    您可以将其称为
    实体::NORM
    ,或者更明确地说(在C++11中),
    实体::分布类型::NORM

    然而,从风格上讲,这不是Java。您所显示的代码将比使用C++中的自然编码方式使用内存变量(在堆栈上创建的变量)更慢,并且可能泄漏内存。您的代码也不会编译,因为
    new
    为您提供了指向对象的指针。但是,

    Entity * salesVolume = new Entity(Entity::NORM);
    
    偏爱

    Entity salesVolume(Entity::NORM);
    

    请记住,如果有帮助,记得投票。谢谢杰伊-检查了这个问题,但是它超出了我的C++技能。我避免将这样的类型定义放入类中。对我来说,它们是自己的东西。如果在另一个类/位置需要这种类型(逻辑),那么将它们绑定到一个类会导致代码重复或普通的不可读代码。让我们考虑一下“一周中的一天”。您可能希望避免一周中有几天的枚举生活在不同的班级中。如果您在第一次使用时将此枚举绑定到一个类,并在500个位置将其用作参数,然后您意识到在第二个类中也需要它,那么您需要进行大量重构,才能将代码库恢复到逻辑状态。而且它是不灵活的,因为您无法将枚举移动到另一个标头。如果客户机想要使用枚举,则必须始终将完整的实体头文件包含在其头文件中。谢谢Juan和Jay。在当前C++中没有强类型枚举,就有可能在类中包含枚举的目的!好吧,至少它在类名称空间中,而不是在全局名称空间中挂起…您还可以将其设置为静态的否?请参阅或@jay,这是一种可能性,但是您不能将其用作函数参数列表中的“类型”,并且您仍然可以比较不同名称空间下的静态。在这方面,强类型枚举更安全。@jay,然后你可以在他的问题下进行注释,他会得到它。即使纠正了stackoverflow错误,你的代码也不能与gcc一起工作(“错误:在“.”标记之前应该有主表达式”)。我不得不使用答案示例,但使用实际变量实例,即Entity*salesVolume=newentity(salesVolume->NORM);所以编译器认为实例版本与枚举类型的实例版本不同?有趣…事实上,你不一定能做到。也许你的编译器允许,但在C++98和C++03中不应该允许。我认为C++11允许这样做。我刚刚检查过,你的第一条语句在C++11中是有效的,但不是C++03/C++98。哦,我想我在C++11领域待得太久了。编辑。
    Entity salesVolume(Entity::NORM);