c++ - 将所有类实例的列表存储为类中的静态数组

标签 c++ class pointers instance

我确信以前已经有人问过这个问题,但是这个问题的术语很令人困惑,而且我对顶级 C++ 还很新,我什至不确定我是否正确使用了它,所以我无法找到之前问过的。如果我错过了,请原谅我。

(如果有人足够专业来纠正我在问题中的语法,请这样做,以便我将来可以更准确;-))

我需要定义一个类,其中成员数组存储指向该类的所有实例的指针。该数组通过每个成员都有的整数 id 进行索引。

因此可以访问:

MyClass testcase = MyClass();
int i = testcase.id;
MyClass* tempVar;
tempVar = MyClass::InstanceRecord[i]; // this is the procedure in ?

应该用指向类“testcase”新创建实例的指针填充tempVar。通过这种方式,类成员可以通过其“id”成员相互引用。

我的问题在于声明数组“InstanceRecord”。我无法控制数组的填充顺序(换句话说,创建类的实例),并且 id 号是预先定义的[段落已编辑]。因此我需要使用以下形式:(注意:这是在类定义中)

static MyClass* InstanceRecord[MAXIMUM_POSSIBLE_INSTANCES] = {x};

为了声明数组,并一步填充数组的整个宽度。这样我就可以在调用 MyClass() (构造函数)期间更改数组给定元素的值。

问题是我不知道如何用尚不存在的内存指针填充数组。请有人好心地向我解释一下上一条语句中“=”右侧的内容,或者提供另一种方法来做到这一点?

编辑:类定义如下所示:

class MyClass{
  Public:
    MyClass(string fileName){

      // Initialize class members from file data
      // including the id member

      // list of other members which require a status of True
      // before this item has an available of True.  id1-id5
      // represent id members of other instances of this class.
      // these id's all come from hard files.
      required_data[] = {id1, id2, id3, id4,id5};
      available=0; //boolean false
      status=0; //boolean false

      // is this the right way to do a vector of pointers?
      InstanceRecord[id]= this;
    }

    MyClass* get_instance_by_id(int i){
      return InstanceRecord[i];
    }

    bool is_available(){
      return available;
    }

    void update_available(){
      int sum = 0;
      for (int i = 0; i<5 ;i++){
        if (InstanceRecord[required_data[i]].status == 1 || required_data[i] == 0){
          sum +=1;
        }
      }
      if (sum >=5){
        available = 1;
      }
    }

  Private:
    int id;
    std::vector<MyClass*>InstanceRecord (MAX_INSTANCES, nullptr);
    int required_data[5];
    bool status;
    bool available;
}

编辑:示例数据文件(通常不允许添加注释,但为了清晰起见添加了注释)

Widget Glue Removal Tool  // becomes MyClass.name
1251                      // becomes MyClass.id
...lots of other stuff... // becomes MyClass.[some_var_name]
14,37,1841,15,27          // becomes the id1...id5 which must be
                          // status checked to determine this
                          // object's available flag.  These ints
                          // are the id's (like this 1251) of those
                          // other instances.

这些数据实际上是我的一个宠物项目,即视频游戏。该类代表“研究树”中的一个项目,在新主题可用之前必须完成先决研究。树和主题不一定是线性的。在获得对项目 47 的访问权限之前,您可能必须研究项目 20,400,12 和 15(因此 ID 为 20、400、12 和 15 的实例都必须具有 status=1,表明它们在项目 47 可用之前已完成) = 1 在研究项目选择窗口中显示)。由于研究树是通过读取目录中的每个文件来填充的,因此以非受控顺序填充,因此在创建该类的第一个实例时,我需要使用某种空指针(目前假设为 nullptr)来填充索引 vector 。我最初的问题是,而且本质上仍然是,如何用这些数据填充 vector 。我现在知道了

std::vector<MyClass*>InstanceRecord(MAX_POSSIBLE_INSTANCES, X);

应该可以满足我的需求,但是 nullptr 可以替换这一行中的 X 吗?

巴里回答中的工厂类实际上教会了我很多东西,但下一个答案似乎更适合我的需要。此时,我只是想确定迈克尔的答案是否可以简单地修改为:

id=<data read in from file>;
InstanceRecord[id]=this;

在他的答案的第五行和第六行。

正如我所说,我只是 C++ 的涉足者,显然我对术语缺乏正确的理解,因此无法很好地陈述问题,导致了一些困惑。测试这个的编译时间将是巨大的,所以我希望在开始这个过程之前让它尽可能没有错误(我们不是吗)。

最佳答案

我认为你想要的是一个对象工厂:

template <typename T>
class Factory {
private:
    static std::vector<std::unique_ptr<T>> instances;

public:
    static T* create() {
        std::unique_ptr<T> obj{new T};
        obj->id = instances.size();
        instances.emplace_back(std::move(obj));
        return instances.back().get();
    }

    static T* get(size_t idx) const {
        return instances[idx].get(); 
    }
};

使用方式如下:

MyClass* testcase = Factory<MyClass>::create();
assert(testcase->id == 0);
assert(Factory<MyClass>::get(0) == testcase);

关于c++ - 将所有类实例的列表存储为类中的静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28055791/

相关文章:

c# - 尝试 COM,C# 默认使用 stdcall 还是必须指定

javascript - 将 .apply() 与 'new' 运算符一起使用。这可能吗?

c++ - 类数组不起作用

java - C++:如何在独立的源文件上定义类,然后在主程序中使用它们?

c++ - 在构造函数中初始化指针的正确方法

c++ - Box2D 如何停止播放器(盒子)旋转

c++ - MachineGuid 的 Linux 等价物

c++ - CToolBar (MFC) 上带有 alpha channel 的 32 位图像

c - 左值需要作为赋值的左操作数吗?

c++ - 指针类型转换没有给出预期的结果