为啥我的类中不能有静态对象? [复制]

Posted

技术标签:

【中文标题】为啥我的类中不能有静态对象? [复制]【英文标题】:Why can I not have a static object in a class? [duplicate]为什么我的类中不能有静态对象? [复制] 【发布时间】:2014-01-13 05:47:44 【问题描述】:

参考以下:

class A  ... ;

class B 

    static A a; // this fails
    ...
    static A& getA()  static A a; return a;  // this works
    ...
;
...
B b;
b.a  <-- gives error: undefined reference to B::a

为什么我不能在class B 中有一个static A,但从方法中返回它就可以了?

[编辑] 有点奇怪:

struct C

    static const int x = 5;
;

int main()

    int k = +C::x;
    std::cout << "k = " << k << "\n";
    return 0;


output: k = 5

C::x 没有在实现范围内定义,也没有C 的实例,但是,unary + C::x 是可访问的...!?

【问题讨论】:

你得到的错误是什么?你能更具体一点吗?在 C++ 中,您可以将静态对象作为类的一部分。 @legends2k:抱歉,已修复。 【参考方案1】:

你肯定可以完全做到这一点。

你可能忘记做的是定义类外的对象(恰好一次):

class B  
    // ...
;

A B::a;

编辑:基于对问题的编辑,现在这基本上是确定性,而不仅仅是概率。

【讨论】:

即使是 B 类的static int n,我也得到了同样的结果; static 是什么要求它必须在类之外定义? @slashmais:这正是 C++ 要求你做事的方式。这是有道理的(即使没有创建类的实例,也需要定义数据项),但对于大多数实际目的,这只是你必须做的事情,这就是生活(或者这就是 C++,无论如何)。 @Jerry Coffin,如果我在 c++(非多线程 Linux 程序环境)中有这么多公共静态类成员变量,有什么问题吗?我已将一些全局变量作为公共静态变量移到一个类中。 @sree:也许将它们放入命名空间更有意义?

以上是关于为啥我的类中不能有静态对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在 TypeScript 类中定义一个 const 字段,为啥静态只读不起作用?

为啥静态类不能实现接口? [复制]

java:在java中为啥静态变量没有this引用?

为啥我不能访问静态多态派生类中的受保护成员?

为啥编译包含静态嵌套类的类会创建一个名为“EnclosureClass$1”的新 .class 文件? [复制]

python中的类中是不是有静态块