在另一个类中定义静态类指针
Posted
技术标签:
【中文标题】在另一个类中定义静态类指针【英文标题】:Defining static class pointer within another class 【发布时间】:2012-10-29 03:36:01 【问题描述】:我有一个类,它有一个指向另一个类的静态指针,它是一个单例。我似乎遇到的问题是我无法从所述类的构造函数中设置指针。这是我当前的代码:
class B;
class A
public:
A();
~A();
;
class B
public:
B();
~B();
static A* a;
;
A::A()
A* B::a = this;
现在,我似乎遇到的问题是我无法在“当前范围”中定义 B::a。另外,“this”指针只能用在“非静态成员函数”中。
我认为问题与在另一个类函数中定义静态类变量有关,但我不确定。
【问题讨论】:
所以你想要一个在类被实例化之前可以使用的静态成员,直到另一个类被实例化后才被定义? 你在问什么?我不确定你的意思。 由于B::a
是公共的(除了是静态的),你可以在A
的构造函数中做B::a = this;
。但效果将是 1) B::a
在创建 A
的第一个实例之前不会被初始化,并且 2) 每次创建 A
的新实例时,B::a
都会发生变化。你确定那是你想要的吗?这听起来非常不寻常。
A 是一个单例类,这意味着它只会被构造一次。它也将在程序开始时构建,因此在它之前几乎没有发生任何事情。
好的。如果B::a
在创建A
的唯一实例的同一位置而不是从A
的构造函数内部分配其值,我会发现它更直观,但这当然是可能的.您代码中的关键问题不是赋值B::a = this
,而是它前面有A *
,这使它成为声明,而不是赋值。
【参考方案1】:
首先,必须定义和声明静态类成员。 B 类主体中的static A* a;
只是一个声明,您需要define a。请注意,每个类成员都必须有一个定义,这就是为什么我们通常在类的适当.cpp
文件中定义静态成员的原因。显然,这发生在类体之外。您也不能在函数范围内定义静态成员。
因此,将 a 的定义移到构造函数的范围之外,如下所示:
class B
public:
B();
~B();
static A* a;;
A* B::a = 0; // Good idea to set a default value for the pointer
但是请注意,a
的值将包含一个 0,直到创建了至少一个 A 类型的对象。
【讨论】:
好的,我明白了。我不知道你必须定义两次静态变量。 请注意,您实际上只定义一个静态变量一次。这个问题***.com/questions/1410563/…的答案将帮助您更好地理解声明和定义之间的区别:)【参考方案2】:您应该在类声明之外定义所有静态成员:
class B;
class A
public:
A();
~A();
;
class B
public:
B();
~B();
static A* a;
;
A* B::a; // HERE
A::A()
B::a = this; // and there was an error here too
别忘了定义其他的ctors/dtors。
【讨论】:
我认为你的意思是定义,而不是声明。以上是关于在另一个类中定义静态类指针的主要内容,如果未能解决你的问题,请参考以下文章