在另一个类中定义静态类指针

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。

【讨论】:

我认为你的意思是定义,而不是声明。

以上是关于在另一个类中定义静态类指针的主要内容,如果未能解决你的问题,请参考以下文章

Jasmine:在另一个类中测试静态函数

在另一个类c ++中调用成员函数

内部类

Java | 嵌套类(Nested Class)

关于类中静态成员函数和静态成员变量的知识点

静态内部类定义在类中,任何方法外,用static定义