我对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:都是公开的,直到您指定其他内容(protected或private).我也提到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].
你不需要这里的指针.事实上,他们可能不是一个好主意.
以下代码适用于我:
#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,这可能不是你想要的.它与私有成员一样.)