如何初始化对类内变量的静态引用,以便在嵌套类中使用

Posted

技术标签:

【中文标题】如何初始化对类内变量的静态引用,以便在嵌套类中使用【英文标题】:How to initialize a static reference to a variable inside the class, for use in nested classes 【发布时间】:2018-07-13 14:21:50 【问题描述】:

我需要在 Class static ref 中保存一个变量,以便将来在嵌套类中使用。 我在使用引用变量(不是静态的)时没有问题,但是对于静态我必须在某些软件中使用int & myClass::refA = ...。 问题是我只能在 myClass 构造函数中使用int & myClass::refA = ...,因为只有在myClass mc(newA) colling 中我得到了 refA 的 ref。 如何在类构造函数中初始化对变量的静态引用?

代码:

class myClass

    private:
        static int & refA;
    public:
        myClass(int &_refA);
        void updateA();
;

myClass::myClass(int &_refA)
: refA(_refA)



void myClass::updateA() 
    refA = refA++;


int newA = 10;
myClass mc(newA);
mc.updateA(); 

错误:

In constructor 'myClass::myClass(int&)':

QF:17:3: error: 'int& myClass::refA' is a static data member; it can only be initialized at its definition

 : refA(_refA)
   ^

exit status 1
'int& myClass::refA' is a static data member; it can only be initialized at its definition

【问题讨论】:

问题是你为什么要这样做?您不能这样做的原因是引用不能未初始化,因此必须在定义它们时进行初始化。 static int* refA = nullptr; 然后在构造函数中设置它? 你想把它初始化成什么?它是一个静态成员,将其初始化为(随机)构造函数的第一个参数是没有意义的。我感觉 XY 有问题。 我同意,这是一件很奇怪的事情,好像是 XY 问题 【参考方案1】:

您可以通过使用具有局部静态变量的静态成员函数来解决此问题,该变量在首次调用时设置为构造函数的参数。

static int dummy =  1;

class myClass

private:
    static int &refA(int &in = dummy)
        static int &buf = in;
        return buf;
    ;
public:
    myClass(int &_refA)refA(_refA);;
    void updateA();
;

静态函数refA() 现在有一个静态成员,该成员将在第一次调用该函数时进行初始化,也就是在构造第一个myClass 时。 refA() 现在的行为类似于对构造的第一个 myClass 对象的构造函数参数的静态引用。

请注意,这是一个可怕的 hack,如果这确实是解决潜在问题的最简单方法,那就是另一回事了(几乎可以肯定不是),并且很可能有一个不需要静态引用的解决方案。

【讨论】:

以上是关于如何初始化对类内变量的静态引用,以便在嵌套类中使用的主要内容,如果未能解决你的问题,请参考以下文章

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值

Static在类中的作用

1.类中数据成员的声明与初始化总结

Core java for impatient 笔记

通过对象引用访问实例变量的静态嵌套类的 Java 示例 [重复]

如何对类内的结构进行快捷方式/绑定? (斯威夫特用户界面)