【问题标题】:Nested type: struct vs class [closed]嵌套类型:结构与类 [关闭]
【发布时间】:2016-07-19 19:44:51
【问题描述】:

什么时候应该在类内部的结构中定义成员,什么时候应该在嵌套类中定义成员?

例如:

class SkypeProtocol
{
public:
    SkypeProtocol();
    virtual ~SkypeProtocol(){}

private:

    class SkypeProtocolDateTime
    {
    private:
        UI32 uDate;
        ERROR GetDateString(PUCHAR pcBuffer,PUI32 uBufLen);
    };

};

或

class SkypeProtocol
{
private:
    SkypeProtocol();
    virtual ~SkypeProtocol(){}

    typedef struct SkypeProtocolDateTime
    {
    private:
        UI32 uDate;
        ERROR GetDateString(PUCHAR pcBuffer,PUI32 uBufLen);
    }SSKYPE_STRUCT;

};

【问题讨论】:

  • typedef struct { ...} structname 是古怪的 C 风格(不是 C++),请使用“struct”
  • 我什至不知道可以在类中声明一个类。这是常用的吗?
  • @steffen 是的,想想迭代器
  • @OMGtechy:所以我 /did/ 知道这是可能的。 :)

标签: c++ c++11 inner-classes


【解决方案1】:

在 C++ 中,类和结构之间没有区别,除了成员的默认可见性(类为私有,结构为公共)。

如果您的对象仅用于存储(本身没有实现太多逻辑),那么通常的做法是将其创建为结构,并仅将类用于更复杂的对象。

顺便说一句:在 C++ 中,您不需要使用 typedef struct {...} StructName; 表示法,简单的 struct StructName {...}; 就足够了。

【讨论】:

    【解决方案2】:
    class SkypeProtocolDateTime;
    class SkypeProtocol
    {
    public:
        SkypeProtocol();
        virtual ~SkypeProtocol(){}
    
    private:
        class SkypeProtocolDateTime* m_pimpl;
    };
    

    我不想暴露我的隐私。

    【讨论】:

    • SkypeProtocolDateTime 不需要在与 SkypeProtocol 相同的范围内定义 - 它也可以是嵌套类(在 .cpp 中定义为 class SkypeProtocol::SkypeProtocolDateTime { ... };)。但是,是的,这是我创建 Pimpls 的首选方式 :)
    • 同意,众所周知,我两者都做。
    • 最好还是std::unique_ptr< SkypeProtocolDateTime > m_dateTime_pimpl;
    【解决方案3】:

    嵌套类并不可取,这有时会让人感到困惑。如果你真的想用这种方式敲击是可以的。

    当您嵌套一个类时,您可能会隐藏并以某种方式将更多数据保密,但 oop 类设计也建议拆分每个类,即使您想在其他类中使用一些。

    私人记忆功能是一门可以解决您的问题的主题,因此请阅读并深入了解;)

    【讨论】:

      【解决方案4】:

      通常的做法是将结构用于无行为或被动对象。它可能包含 CONSTANTS 但总体上缺乏功能。 Date 成员应该直接访问而不是使用 getter 和 setter 方法,因为它具有默认的公共可见性。实际上它是 google c++ 风格指南的一部分,也是处理用户定义类型的非常干净的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 1970-01-01
        • 2020-10-30
        • 2015-10-04
        相关资源
        最近更新 更多