【问题标题】: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 *,这使它成为声明,而不是赋值。

标签: c++ class variables static


【解决方案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 类型的对象。

【讨论】:

  • 好的,我明白了。我不知道你必须定义两次静态变量。
  • 请注意,您实际上只定义一个静态变量一次。这个问题stackoverflow.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。

【讨论】:

  • 我认为你的意思是定义,而不是声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2022-09-30
  • 1970-01-01
  • 2011-12-13
  • 2013-12-08
  • 1970-01-01
  • 2015-06-19
相关资源
最近更新 更多