【问题标题】:enum, classes, namespaces and long names枚举、类、命名空间和长名称
【发布时间】:2018-04-06 06:33:55
【问题描述】:

据我了解,与类相关的枚举应该在类中声明,如下所示:

namespace Sensors {
class MySensor {
 public:
     enum class SensorStatus {
         kSensorActive,
         kSensorInactive
     }
     SensorStatus GetCurrentStatus(void);
};
}

我遇到的问题是,它导致程序的另一部分出现以下代码。

 Sensors::MySensor::SensorStatus current_status = mySensor.GetStatus();
 switch (current_status):
     case Sensors::MySensor::SensorStatus::kSensorActive:  // 47 characters!
          printf("Sensor is active.");
          break;
     case Sensors::MySensor::SensorStatus::kSensorInactive:  // 49 characters!
          printf("Sensor is inactive.");
          break;

我很欣赏kSensorActivekSensorInactive 所指的内容非常清楚,没有歧义。但是,如果您尝试遵循指定 80 个字符的样式指南,我们最终会出现很多换行符,这会降低清晰度,恕我直言。如果我们有一个函数需要两个不同的枚举器,那么长线的一个例子就是; MyFunction(NamespaceA::MyFirstClass::MyFirstEnum::AnEnumerator, NamespaceB::MySecondClass::MySecondEnum::ADifferentEnumerator) - 多达 127 个字符。

这些长名字很常见还是我遗漏了什么?

【问题讨论】:

标签: c++ enums


【解决方案1】:

首先,你重复一些东西:

如果您已在名称中指定SensorStatus,则名称kSensorActive 不必说Sensor。或者你可以从SensorStatus 中删除Sensor,如果它在MySensor 中。也许两者兼而有之。

将事物包装在类和命名空间中的想法是,您可以一遍又一遍地使用相同的名称来表示“同一类事物”,而不是始终使用完全唯一的名称。

您也可以在本地使用using 更改名称,类似这样

using Status = Sensors::MySensor::SensorStatus;

然后是我们Status::kSensorActive,您之前使用过长的东西。

【讨论】:

  • 非常正确。来自 C 世界,我很容易对枚举使用长名称,因为 C 没有相同的命名空间,所以我必须将枚举及其常量命名为 MySensorStatuskMySensorStatusInactive。有了 C++ 的命名空间,就不再需要了。
【解决方案2】:

要在不降低整体范围清晰度的情况下减少长度,您至少有 2 个选项:

  1. 别名类型,即。 using Status = Sensors::MySensor::SensorStatus;
  2. typedef 即。 typedef Sensors::MySensor::SensorStatus Status2;

在这个函数的范围内使用它们,这样它是本地的,并且不明确的名称不会在整个代码中传播。 Here is a live example.

【讨论】:

  • 谢谢,我不知道你可以将using 用于命名空间以外的地方! (有人告诉我不要这样做)
  • @T'n'E 你应该被告知不要在 header 文件中使用usingusingclause 可以在所有代码中传播,如这个答案是评论。但是在函数内部甚至 .cpp 内部使用它是完全没问题的,它的范围可以完全控制。
  • 也许我们的意思是不同的用途,但Google's styleguide 并没有区分您放置using namespace foo 的位置——这是我之前知道的唯一用途。 :) 我可以看到以上述方式使用它时的区别(并包含在 .cpp 文件中)。
猜你喜欢
  • 2016-03-27
  • 2023-03-30
  • 2014-07-24
  • 2020-04-05
  • 1970-01-01
  • 2011-10-28
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多