【问题标题】:How should I name these classes?我应该如何命名这些类?
【发布时间】:2016-11-03 13:43:19
【问题描述】:

我有两组不同的类,它们继承自两个不同的基类(ValueToken)。

在这两个组中,我都有类,我会简单地调用 StringNumberName,只要它们的名称与其他组的类名不冲突。

所以基本上我需要一种方法来区分继承自 Value 的类 String 和继承自 Token 的类 String,我不知道如何做到这一点。

我不能将它们放在它们基类的命名空间中,因为它们继承自它们所在的同一个类,并且编译器给了我一个“不完整类型的无效使用”错误。我应该如何解决这个问题?

【问题讨论】:

  • 为什么不将它们命名为ValueStringTokenString
  • @Eli Sadoff 因为在发布此答案之前我没有考虑过该解决方案.-.
  • 当我说“你为什么不呢”时,我只是这样说。我不是说“你这个白痴!”。
  • 这就是命名空间的用途!我说的还不够。

标签: c++ c++11 naming-conventions


【解决方案1】:

简单的解决方案是将它们命名为StringValueStringToken

您不能在它们的基类中定义它们,例如:

struct Value
{
    struct String : Value {};
};

但是您可以在命名空间中定义它们和基类

namespace Value
{
    struct Base {};
    struct String:Base {};
}

然后参考Value::BaseValue::String

虽然我非常喜欢命名空间,但在这种特殊情况下,我倾向于StringValue 解决方案。

(注意:我在示例中使用了struct,因为它省去了public 的所有麻烦。对于实际代码,您可能希望使用class。)

【讨论】:

  • 实际上,从技术上讲,您可以将基类放在命名空间之外,但您仍然不能给它与命名空间相同的名称——这样做会很愚蠢!
  • 你可以给命名空间同名,只要它在命名空间ideone.com/YPziDy内即可
  • @vsoftco:我知道 - 这就是为什么我说你不能那样做。
  • @StoryTeller:哦!在命名空间内 - 是的,你可以,但这会非常混乱。 Value::Value::Value 将是构造函数!
  • @MartinBonner,是的。其实it gets better than that
【解决方案2】:

命名空间应该没有问题。

struct Value {};
struct Token {};

namespace Values { struct String : Value {}; }
namespace Tokens { struct String : Token {}; }

应该有效,应该

namespace Values { struct Value {}; struct String : Value {}; }
namespace Tokens { struct Token {}; struct String : Token {}; }

一件事是行不通的

struct Value
{
    struct String : public Value {};
}; 

因为当您尝试继承 Value 时,它并没有完全定义。
如果这是你正在做的事情,解决办法就是不要这样做。

【讨论】:

    【解决方案3】:

    打电话给一个StringValue和另一个StringToken

    【讨论】:

      猜你喜欢
      • 2022-07-19
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多