对象内部对象的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*/ } 

Is this correct?

我想这个工作:

//ObjectB.cpp 
Object::objects[0]->stuff(); 

当我运行它,我得到 “访问冲突读取位置0xCCCCCCCC” 的错误。

+0

你已经发布了你的代码片段。 [MCVE](http://*.com/help/mcve)会很有帮助。 – 2014-10-03 06:51:01

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; 
} 

这是你想要的吗?

+0

好吧,没有它我得到“无法解析的外部符号”编译错误。 – George 2014-10-03 05:58:25

+0

如果每个文件都不大(比如最多20行),则可以发布所有内容,以及用于编译它的命令。否则,一个易于访问的链接可能是好的。我几乎看不出问题的原因。 C/C++在模块化编程方面相当原始,所以如果我们没有正确地提供它们,编译器就不能自动解析相互关联的符号。 – LeleDumbo 2014-10-03 06:05:30

假设“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构造函数)。

对于“是否有另一种方式来跟踪所有的对象”,好吧,这取决于你想要达到的目标。

+0

我不希望它继承任何东西。我希望能够遍历每个对象并运行成员函数。 – George 2014-10-03 06:03:08

+0

但是,如果ObjectB不继承对象(因为它是“Object”的向量),则无法将ObjectB实例放入“对象”向量中。你想将你的ObjectB实例存储在不同的向量中吗? (也许我在这里误解了一些东西,你有ObjectB类吗?或者ObjectB.cpp包含Object类的实现?) – FBForecomm 2014-10-03 06:16:15