【问题标题】:C++ static vector of objects inside Object contstructor access?对象构造函数访问中对象的C++静态向量?
【发布时间】:2014-10-03 05:32:01
【问题描述】:

我想要一个在 Object 内部的静态向量,它存储指向每个构建过的 Object 的指针,这样我就可以在每个 Object 中运行一个循环。

//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”错误。

【问题讨论】:

  • 您已经发布了一些代码。 MCVE 会很有帮助。

标签: c++ pointers object vector static


【解决方案1】:

假设“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”。不要忘记从您的 ObjectB 构造函数中调用您的 Object 构造函数,否则您的 ObjectB 实例将不会被添加到您的 Object::objects 向量中:

// 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 构造函数)。

对于“是否有另一种方法来跟踪所有对象”的问题,这取决于您要实现的目标。

【讨论】:

  • 我不希望它继承任何东西。我希望能够遍历每个对象并运行一个成员函数。
  • 但是如果 ObjectB 不继承 Object(因为它是“Object”的向量),则不能将 ObjectB 实例放入“objects”向量中。您想将您的 ObjectB 实例存储在不同的向量中吗? (也许我在这里误解了一些东西,你有一个 ObjectB 类吗?或者 ObjectB.cpp 确实包含 Object 类实现?)
【解决方案2】:

对象.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

对象.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;
}

这是你想要的吗?

【讨论】:

  • 好吧,没有它我会得到“未解析的外部符号”编译错误。
  • 如果每个文件都不大(比如最多 20 行),您可以发布所有内容,以及用于编译它的命令。否则,一个易于访问的链接可能没问题。我几乎看不到问题的原因。 C/C++ 在模块化编程方面非常原始,因此编译器无法自动解析链接符号,除非我们正确提供它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2018-11-10
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多