为静态类成员使用名称空间

时间:2013-09-18 13:25:01

标签: c++ namespaces

有人可以解释为什么以下代码不起作用?我找不到任何资源来解释命名空间,类和标识符如何组合在一起。当你执行my_class :: my_member时,my_class :: part不是命名空间?它是什么?

#include <iostream>

class my_class {
    public:
            static void my_member() {
                    std::cout << "worked" << std::endl;
            }
};

int main() {

    using namespace my_class; // error: 'my_class' is not a namespace-name

    my_member(); // error: 'my_member' was not declared in this scope

    my_class::my_member(); // works
}

作为一个更普遍的问题:有没有一种方法可以引用静态类成员而无需每次都执行my_class :: namespace / identifier /?

而不是

my_class::my_member_1
my_class::my_member_2

我只想要

my_member_1
my_member_2

这可能吗?谢谢。

3 个答案:

答案 0 :(得分:1)

my_class不是命名空间,而是类名(类型)。因此,您无法将using namespacemy_class一起使用。

如果您想在不添加类名前缀的情况下使用my_member_1,请创建一个全局包装函数。

void my_member_1() {
    my_class::my_member_1();
}

答案 1 :(得分:1)

  

这可能吗?

是的,间接的。如果您创建一个在my_class范围内运行的方法,那么您可以获得所需的行为。

#include <iostream>

class my_class {
    public:
            static void my_member() {
                    std::cout << "worked" << std::endl;
            }
            static int my_main();
};

int my_class::my_main() {

    my_member(); // no error

    my_class::my_member(); // works too
    return EXIT_SUCCESS;
}

int main() {
     my_class::my_main();
}

答案 2 :(得分:-1)

当你调用这样的静态函数时:

my_class::my_member();

您正在引用类定义来查找静态函数。对于每个类的实例,静态函数都是相同的。您无法通过简单地调用函数名称或通过创建类的实例来调用静态函数来访问静态函数。

如果你想直接调用静态函数而不记下类定义,你可以这样做:

#define my_member_1 my_class::my_member_1()
#define my_member_2 my_class::my_member_2()
...

之后你可以简单地调用my_member_1来执行静态函数,但这可能会让大型程序感到困惑。我的建议是继续使用类定义,以便确切地知道您正在调用的函数。