6

“传统” C++ 类(只是一些随机声明)可能类似于以下内容:

class Foo
{
public:
  Foo();
  explicit Foo(const std::string&);
  ~Foo();

  enum FooState
  {
    Idle, Busy, Unknown
  };

  FooState GetState() const;
  bool GetBar() const;
  void SetBaz(int);

private:
  struct FooPartialImpl;

  void HelperFunction1();
  void HelperFunction2();
  void HelperFunction3();

  FooPartialImpl* m_impl; // smart ptr
  FooState m_state;
  bool m_bar;
  int m_baz;
};

如果最初的程序员没有整齐地组织他的“访问区域”,我总是觉得这种访问级别规范很难看并且难以遵循。


查看 Java/C# 风格的相同代码段,我们得到:

class Foo
{
  public: Foo();
  public: explicit Foo(const std::string&);
  public: ~Foo();

  public: enum FooState
  {
    Idle, Busy, Unknown
  };

  public: FooState GetState() const;
  public: bool GetBar() const;
  public: void SetBaz(int);

  private: struct FooPartialImpl;

  private: void HelperFunction1();
  private: void HelperFunction2();
  private: void HelperFunction3();

  private: FooPartialImpl* m_impl; // smart ptr
  private: FooState m_state;
  private: bool m_bar;
  private: int m_baz;
};

在我看来,这在标题中更容易阅读,因为访问说明符就在目标旁边,而不是一堆行之外。我发现在使用没有分成通常的“*.hpp/*.inl”对的仅标题模板代码时尤其如此。在那种情况下,函数实现的规模压倒了这个小而重要的信息。


我的问题很简单,因为我从未见过其他人在他们的 C++ 代码中积极地这样做。

假设我没有支持“类视图”的 IDE,使用这种冗长级别是否有任何明显的缺点?

欢迎任何其他风格的建议!

4

5 回答 5

10

“在罗马做到入乡随俗。”

我在 Java 上花了很多时间,比如分别为每个字段和方法指定访问说明符的风格。但是,当我使用 C++ 编程时,我总是使用您的第一个代码片段中显示的样式。

于 2010-04-11T05:56:38.170 回答
5

就个人而言,我觉得必须为每个符号指定访问限定符非常烦人。它使事情更难阅读,而不是更容易,并鼓励在整个类定义中自由混合私有和公共内容的非常坏的习惯。我经常看到这种混乱。在 C# 中,我尝试使用#region private等来缓解这种情况,希望能鼓励未来的维护者保持清洁。

于 2010-04-11T05:42:36.057 回答
1

它没有任何问题,尽管你会扬起眉毛。保持访问说明符分开的主要优点是它鼓励将所有私有成员和方法放在类的顶部 - 一起。

如果您的类太大而无法容纳在一个屏幕上,那么它可能应该被分解为多个类,和/或任何隐式内联函数都应该显式声明为内联,并将实现移出类。

于 2010-04-11T05:42:39.683 回答
0

确实,从语义上讲,这没有什么区别,但是如果您只遵循公认的内容,那么您将为您自己和您的同事带来很大的帮助。

我个人喜欢我的课:

struct S {
    S(int m) : m(m) { }
    S(const S& o);
    S& operator=(const S& o);

    void f() const;
    std::string g();

private:
    void help();

private:
    int m;
};

但是如果我提交到一个严格来说不是我的存储库,我会毫不犹豫地改变我的举止,因为我知道如果有人按照我的习惯将他们的代码提交到我的存储库,我会多么感激。

于 2010-04-11T07:53:55.150 回答
0

后一种方法的缺点是很少这样做,并且以这种方式让其他开发人员感到惊讶并不是一个好主意,并且需要输入一百万次访问修饰符。使用传统方法将不必一遍又一遍地不必要地键入修饰符,这也是预期的方法。

于 2010-04-11T05:54:51.137 回答