如何创建类的静态对象成员?

dom*_*lao 4 c++

我对c ++很新,特别是在它的技术方面.我的问题是,如何创建类本身的静态对象成员.我的意思是我在类中声明了一个静态成员对象.例:

CFoo:CFoo *pFoo[2] = {0};

class CFoo
{
   public: static CFoo *pFoo[2];
   public: CFoo(int a);
   public: CFoo *getFoo();
};
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如何创建pFoo,就像我想创建两个静态对象pFoo一样,

pFoo[0] = new CFoo(0);
pFoo[1] = new CFoo(1);
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用getFoo方法返回一个pFoo,比如

CFoo *getFoo()
{
   return pFoo[0]; //or pFoo(1);
}
Run Code Online (Sandbox Code Playgroud)

非常感谢你们.希望我的问题很清楚.

再次感谢您的提前.-sasayins

Mic*_*fik 20

让我们一步一步改进您的代码.我将解释我在每一步所做的事情.

第1步,这不是Java.您不需要为每个成员指定公共.之后的所有内容public:都是公开的,直到您指定其他内容(protectedprivate).我也提到pFoo了课后的定义.在声明变量之前,您无法定义变量.

class CFoo
{
   public: 
      static CFoo *pFoo[2];
      CFoo(int a);
      CFoo *getFoo();
};

CFoo* CFoo::pFoo[2] = {0};
Run Code Online (Sandbox Code Playgroud)

第2步,pFoo如果你有一个getFoo成员函数,可能不应该是公开的.让我们强制实现类的接口,而不是暴露内部数据.

class CFoo
{
   public: 
      CFoo(int a);
      CFoo *getFoo();

   private:
      static CFoo *pFoo[2];
};

CFoo* CFoo::pFoo[2] = {0};
Run Code Online (Sandbox Code Playgroud)

第3步,你可以通过指针返回而无需费心去使用new.我已经编写了很多年的C++代码,而且我必须查看delete为静态成员变量而新建的内存.找出它是不值得的麻烦,所以让我们把它们分配到堆栈上.另外,让我们通过const指针返回它们,以防止用户意外修改两个staticCFoo对象.

class CFoo
{
   public: 
      CFoo(int a);
      const CFoo *getFoo();

   private:
      static CFoo foos[2];
};

CFoo CFoo::foos[2] = {CFoo(0), CFoo(1)};
Run Code Online (Sandbox Code Playgroud)

然后实现getFoo变为:

const CFoo * CFoo::getFoo()
{
   return &foos[0];  // or &foos[1]
}
Run Code Online (Sandbox Code Playgroud)

IIRC,静态成员foos将在您第一次创建CFoo对象时分配.那么,这段代码......

CFoo bar;
const CFoo *baz = bar.getFoo();
Run Code Online (Sandbox Code Playgroud)

...是安全的.命名指针baz将指向静态成员foos[0].


Kon*_*lph 6

你不需要这里的指针.事实上,他们可能不是一个好主意.

以下代码适用于我:

#include <iostream>

struct Foo {
    static Foo const foos[];

    Foo(int i) : i(i) { }

    int i;
};

Foo const Foo::foos[2] = { Foo(1), Foo(2) };

using namespace std;

int main() {
    cout << Foo::foos[0].i << endl;
}
Run Code Online (Sandbox Code Playgroud)

(注意(为了保持演示简单)我已经创建了所有成员public,这可能不是你想要的.它与私有成员一样.)