2011-08-25 37 views
2

也许它听起来很愚蠢,但我不知道什么是最好的方式来处理这个问题:面向对象编程 - 作为成员的变量或仅作为全局变量的头部变量?

我有一个类,例如提供对某个COM端口的访问。要使用这个,你必须建立一个包含信息的缓冲区。这个缓冲区是作为一个typedef实现的。现在这个typedef位于类的头文件中,但不在类中作为成员。不同的是你可以访问这个缓冲区的方式(包含头文件)。 作为一类成员:

CMyClass::MyBuffer MyBuf; 

或者仅仅位于头一个全球性的:

MyBuffer MyBuf; 

我有几个数据我不知道往哪里放,这样的行为一些静态瓦尔作为缓冲区中的唯一标识符。所以我们在这里讨论静态和typedefs。

从技术上讲,他们属于这个班级,因为没有这些,你就无法使用它。但使用类名和它的范围操作符来访问这些类型的时间要长得多。

这个问题怎么解决?

回答

1

您不应该避免将某些东西放在属于某个类的类中,因为您每次需要访问该类时都觉得不方便。

+0

另一方面,名称空间也用于逻辑分组类。 – Jon

+0

命名空间,没错,没想到...... – binaryguy

0

一种可能的解决方案是将类CMyClassMyBuffer放入相关命名空间并使用using指令。例如:

namespace MyNS { 
    class CMyClass 
    { 
     // snip 
    }; 

    typedef blah MyBuffer; 
} 

some_function() 
{ 
    MyNS::CMyClass a; 
    MyNS::MyBuffer b; 
} 

using namespace MyNS; 

some_other_function() 
{ 
    CMyClass a; 
    MyBuffer b; 
} 

这可能是一个可能的解决方案。

1

我猜你正在使用的实际名称是更具描述性的MyBuffer。缓冲区是否属于该类,除了被它使用?它在某种程度上取决于在那个特定的类中,并且将一个相同描述的typedef放在不同的类中,行为有什么不同?如果另一个类需要类似的东西,那么相同的typedef会这样吗?

在我看来,如果你对上述问题回答“否”,typedef根本不属于该类;它似乎只被该类使用。将它保持为全局更有意义,因为您可能有另一个类使用typedef,但最终会保留MyBuffer在某种程度上与CMyClass相关的含义。

+0

以及缓冲区的存在是因为那个类。以UART为例。你需要的是一个保持波特率和有效载荷的typedef结构。所以每个想和这个类交谈的人都需要知道这个缓冲区,因为它是连接这个类的唯一方式。所以它可以被许多类使用。但是如果没有命名空间或者你没有放入类中,就不能有另一个具有相同名称的typedef。 – binaryguy

+0

当然,这个类可以使用typedef(假设它是'std :: vector '),但这并不意味着typedef在某种程度上是固有的。如果您以后想要将这个类抽象为几个不同的视图,或者创建一个这样的缓冲区的类,该怎么办? typedef可能属于这个类,但我从这个问题或澄清中看不到任何证据 - 它看起来就是用法,在我看来,它应该是非成员。 –