如何初始化对类内变量的静态引用,以便在嵌套类中使用
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++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值