C ++命名空间和类

时间:2015-07-27 13:54:20

标签: c++ class namespaces constants

我想在不调用类的情况下使用类中的常量,只需调用常量,如下所示:

头文件(.h)

class myClass{

   public: 
      const static char CHAR_S = '<';
}

源文件(.cpp)

using namespace myClass;
char separator = CHAR_S; //I want to call the constant without using the class (myClass::CHAR_S)

我该怎么做?

最小的完整示例:

class MyClass {
    public:
    static const char CHAR_S = '<';
};

int main() {
    using namespace MyClass;
    char separator = CHAR_S;
    return 0;
}

导致以下编译器错误:

main.cpp: In function 'int main()':
main.cpp:7:21: error: 'MyClass' is not a namespace-name
     using namespace MyClass;
                     ^
main.cpp:7:28: error: expected namespace-name before ';' token
     using namespace MyClass;
                            ^
main.cpp:8:22: error: 'CHAR_S' was not declared in this scope
     char separator = CHAR_S;
                      ^
main.cpp:8:10: warning: unused variable 'separator' [-Wunused-variable]
     char separator = CHAR_S;
          ^

4 个答案:

答案 0 :(得分:3)

myClass不是命名空间,你不能那样使用它。我想你想要这样的东西:

namespace constants{
    const static char CHAR_S = '<';
};

using constants::CHAR_S;
int main(int argc, char ** argv)
{
    char a = CHAR_S;
    return 0;
}

答案 1 :(得分:3)

类不是命名空间。如果没有按类名对其进行限定,则无法引用CHAR_S。

要做你想做的事,你可以简单地将静态变量放在命名空间中:

namespace MyClass {
    static const char CHAR_S = '<';
} // namespace MyClass

int main() {
    using namespace MyClass;
    char separator = CHAR_S;
    return 0;
}

实例:http://coliru.stacked-crooked.com/a/74fcfee559cc1390

显然,调用你的命名空间MyClass会产生误导(因为它不是一个类),所以选择一个更好的名字。

答案 2 :(得分:3)

根据C ++标准(3.3.7类范围)

  

2类成员的名称只能按如下方式使用

     

- 在其类的范围内(如上所述)或派生的类   (第10条)来自其班级,

     

- 之后。运算符应用于其类型的表达式   class(5.2.5)或从其类派生的类

     

- 在 - &gt;之后运算符应用于指向其类对象的指针   (5.2.5)或从其类中派生的类

     

- 将:: scope resolution运算符(5.1)应用于名称之后   它的类或派生自其类的类。

所以我看到唯一的方法是引入另一个引用类数据成员或将具有其值的变量。例如

#include <iostream>

struct A
{
    const static char CHAR_S = '<';
};

const char A::CHAR_S;
const char &CHAR_S = A::CHAR_S;

int main()
{
    std::cout << CHAR_S << std::endl;
}    

答案 3 :(得分:1)

简单的技巧;重新定义参考。这是一个例子。

Header.h

#ifndef __HEADER__
#define __HEADER__

class MyClass
{
public:
    const static char CHAR_S = '<';
    MyClass();
    ~MyClass();
};

#endif

Class.cpp

#include "MyClass.h"
const static char &CHAR_S = MyClass::CHAR_S;

MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}