对象内部对象的C++静态向量访问吗?
我想要一个内部的静态向量存储指向每个对象的指针,所以我可以运行一个循环遍历每个对象。对象内部对象的C++静态向量访问吗?
//Object.h
public:
Object();
stuff();
static vector<Object*> objects;
//Object.cpp
vector<Object*> Object::objects;
Object::Object(){ objects.push_back(this); }
Object::stuff(){ /*Do stuff*/ }
我想这个工作:
//ObjectB.cpp
Object::objects[0]->stuff();
当我运行它,我得到 “访问冲突读取位置0xCCCCCCCC” 的错误。
Object.h:
#ifndef OBJECT_H
#define OBJECT_H
#include <vector>
using namespace std;
class Object {
public:
Object();
void stuff();
static vector<Object*> objects;
};
#endif // OBJECT_H
Object.cpp:
#include "Object.h"
#include <iostream>
using namespace std;
vector<Object*> Object::objects;
Object::Object() {
objects.push_back(this);
}
void Object::stuff() {
cout << "Stuff from object" << endl;
}
ObjectB.cpp:
#include "Object.h"
#include <vector>
using namespace std;
int main() {
Object a,b,c;
// this loop should run 3 times, as many as Object instance created
for (vector<Object*>::iterator it = Object::objects.begin(); it != Object::objects.end(); it++) {
(*it)->stuff();
}
return 0;
}
这是你想要的吗?
假设“ObjectB”类继承了“Object”类,那么Object.h和Object.cpp都可以。
// Object.h
static vector<Object*> objects; // [Is this correct?][1]
- >确定,静态成员声明
// Object.cpp
vector<Object*> Object::objects; // [Is this correct?][1]
- >确定,静态成员初始化(在你的CPP文件)
// Object.h
vector<Object*> Object::objects; //[error C2838][2]
- >这是不对的,我承担ObjectB继承了Object,你不必声明它。要引用你的静态成员,你只需要做“Object :: objects”。不要忘记从你的对象B构造函数中调用你的对象构造,否则你的对象B实例不会被添加到您的对象::对象矢量:
// ObjectB.cpp
ObjectB() : Object() // Calling Object() will add your instance to "objects" vector
{
...
}
然后:
Object::objects.stuff(); // or with ->, i.e. Object::objects->stuff()
- >这应该工作(如果您不忘记从ObjectB构造函数中调用Object构造函数)。
对于“是否有另一种方式来跟踪所有的对象”,好吧,这取决于你想要达到的目标。
我不希望它继承任何东西。我希望能够遍历每个对象并运行成员函数。 – George 2014-10-03 06:03:08
但是,如果ObjectB不继承对象(因为它是“Object”的向量),则无法将ObjectB实例放入“对象”向量中。你想将你的ObjectB实例存储在不同的向量中吗? (也许我在这里误解了一些东西,你有ObjectB类吗?或者ObjectB.cpp包含Object类的实现?) – FBForecomm 2014-10-03 06:16:15
你已经发布了你的代码片段。 [MCVE](http://*.com/help/mcve)会很有帮助。 – 2014-10-03 06:51:01