-1

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

#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

这可能吗?谢谢你。

4

3 回答 3

1

my_class不是命名空间,它是一个类名(一种类型)。因此,您不能使用using namespacewith my_class

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

void my_member_1() {
    my_class::my_member_1();
}
于 2013-09-18T13:27:59.470 回答
1

这可能吗?

是的,间接的。如果你创建了一个在my_class's 范围内操作的方法,那么你可以获得你想要的行为。

#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();
}
于 2013-09-18T13:29:23.863 回答
-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 来执行您的静态函数,但这在大型程序中可能会让人感到困惑。我的建议是继续使用类定义,这样你就知道你正在调用什么函数。

于 2013-09-18T13:38:40.193 回答