【问题标题】:Understanding how to correctly treat c++ class constants了解如何正确对待 c++ 类常量
【发布时间】:2011-04-11 10:53:03
【问题描述】:

考虑以下几点:

namespace MyNamespace{
class MyClass {
public:
   // Public area
private:
   // Private area
protected:
   // Protected area
}; /* Class */
} /* Namespace */

考虑到我想定义一个特定于我的班级的常量。 我通常会这样做:

namespace MyNamespace{
// Constants
const int MYINT = 12;
const std::string MYSTR = std::string("Hello");
// Class definition
class MyClass {
public:
   // Public area
private:
   // Private area
protected:
   // Protected area
}; /* Class */
} /* Namespace */

通过这种方式,我可以通过这种方式获取我的变量(在我的代码中的某处):

MyNamespace::MYINT;
MyNamespace::MYSTR;

这是一个好习惯吗? 考虑到可以通过多种方式处理常量(例如,通常使用enum 处理数字常量),定义常量的最佳方法是什么(与类相关,但在其他地方也很有用)?

谢谢

【问题讨论】:

  • 删除了所有的元标签(那些没有真正说明问题的标签),以及一开始的冗长的“分类”。只要问你的问题,没有所有的手续。让其他人更容易阅读您的问题。
  • 无需抱歉。 :) 请记住,提出问题的目的是使其清晰且易于理解。这意味着它应该只包含必要的信息,并立即进入重点。我们知道这是一个 C++ 问题,因为它被标记为这样(并且它在标题中),因此无需花费问题的前 3 行来告诉我们相同的内容。我们知道这是关于最佳实践的,因为没有人问过最差实践。这里的每个问题都是关于做某事的方法。 ;)

标签: c++


【解决方案1】:

如果您想要特定于类的常量,并且还希望它们在您所说的其他地方有用,可能在类之外,那么在类的public 部分中将它们定义为static 成员数据:

//.h file
class MyClass 
{
 public:
   //constants declarations
   static const int MYINT;
   static const std::string MYSTR;
};

//.cpp file
//constants definitions 
const int MyClass::MYINT = 12;
const std::string MyClass::MYSTR = std::string("Hello");

使用(或访问):

std::cout << MyClass::MYINT << std::endl;
std::cout << MyClass::MYSTR << std::endl;

输出:

12
Hello

在线演示:http://www.ideone.com/2xJsy


如果你想定义许多整数常量并且它们都以某种方式相关,你也可以使用enum,例如:

class shirt
{
 public:
   //constants declarations
   enum shirt_size
   {
        small, 
        medium,
        large,
        extra_large
   };
};

但如果积分常数不相关,那么在我看来,将它们定义为 enum 就没有多大意义。

【讨论】:

  • @Andry:不,你不能。您需要在标头中声明它们并在单独的.cpp 文件中定义它们。
  • @Andry:不,你不能。如果这样做,如果将头文件包含到许多 cpp 文件中,则会出现多个定义错误。所以最好的方法是:定义应该在 .cpp 文件中,因为我编辑了我的答案。
  • @Andry: 我可以只在标题中声明和定义它们吗? 简短的答案是否定的,但有更长的答案...如果常量是整数类型,您只需 声明 并在标头中分配值即可逃脱。细节是你只能在整数常量没有used的情况下这样做,其中used基本上意味着用作左值。 IE。您可以将其用作编译时间常数或在右值足够的任何情况下使用:int x = 1 + type::constant;,但不是在需要左值的情况下:int const &amp; k = type::constant;
  • @Nawaz:对于整数常量,通常最好在声明中提供值,而不是在定义中提供。这使编译器能够将该值用作编译时间常数。 struct test { static const int a = 5; static const int b; }; int const test::a; int const test::b = 7; int array[ test::a ]; /*ok*/ int error[test::b]; /*not ok*/
  • @David Rodríguez:很好。我通常这样做。我现在没有这样做,因为还有const std::string,我无法在类本身中对其进行初始化。所以为了一致性,我这样做了。 :-)
【解决方案2】:

当然没有“最佳”解决方案,因为这是一个非常主观的术语。

考虑到您提到在其他地方使用的常量,我们可以说它们应该在protected(如果它们仅由派生类使用)或更可能在public 部分中声明类。

非整数类型的常量应定义为static const 成员(但如果有任何其他静态对象引用这些常量,则必须小心order of static initialization )。

整数类型的常量可以声明为static const int 或枚举,正如您已经提到的。这里的判别因素是两个或多个常量是否可以在逻辑上组合在一起。

例如,这可能是个好主意:

class MyClass {
    public:
        enum {
            Color_Red,
            Color_Green,
            Color_Blue,
        };
};

虽然不是这样:

class MyClass {
    public:
        enum {
            Color_Red,
            Vehicle_Car,
        };
};

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 2021-07-27
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多