C++ 如何在C+中访问一个项目中具有相同类型/类的所有对象+;?

C++ 如何在C+中访问一个项目中具有相同类型/类的所有对象+;?,c++,class,for-loop,types,foreach,C++,Class,For Loop,Types,Foreach,我想调用项目中存在的所有对象。我该怎么做 Class1 Abc; Class1 Xyz; Class1 asd[100]; for each (Class1 k in ???) { k.dosomething(); } C++没有,所以这是不可能的 您可以通过将Class1的所有对象存储在一个容器中,然后迭代来解决这个问题。例如,您可以有一个静态成员变量,一个向量,在构造函数中,您只需将this添加到向量中即可。但它只适用于单个类,并且没有好的或标准的方法来概括它 有一些库可以添加简单

我想调用项目中存在的所有对象。我该怎么做

Class1 Abc;
Class1 Xyz;
Class1 asd[100];
for each (Class1 k in ???)
{
    k.dosomething();
}
C++没有,所以这是不可能的

您可以通过将
Class1
的所有对象存储在一个容器中,然后迭代来解决这个问题。例如,您可以有一个静态成员变量,一个向量,在构造函数中,您只需将
this
添加到向量中即可。但它只适用于单个类,并且没有好的或标准的方法来概括它


有一些库可以添加简单的类型内省功能,但它总是要求您向类中添加额外的代码,并使用宏。

C++语言不支持这一点,但您可以将其作为一个函数来实现。这种模式对于在受严格限制的环境中高效地管理内存和经济地使用内存及其他资源特别有用,在这种环境中,即使是很小的性能提升也至关重要。

C++没有“项目”的概念,因此,对于如何在项目中对给定类的所有对象调用方法,没有正式正确的答案

你的意思可能是在“程序”中

一种方法是在这样的对象指针的全局集合中注册指向每个对象的指针。一个主要问题是,理想情况下,必须由构造函数来完成注册工作,而构造函数不知道该对象是否会以
const
结束。因此,您可能会无意中在
const
对象上调用修饰符方法

一个(有限的)解决方案是在可行的情况下,让
作为
const
方法来做某事

另一个(一般但更复杂)的解决方案是将该类对象的创建限制为工厂函数,因为工厂函数可以在成功构建后将对象变成
const
后注册对象。

您可以使用继承类来更新包含所有类的容器

#include <iostream>
#include <unordered_set>

template <typename T>
class IterableType{
public:
  std::unordered_set<T const*>& allClasses(){
    return classes_;
  }

protected:
  IterableType(){
  IterableType<T>::classes_.insert(static_cast<T*>(this));
}

IterableType(const IterableType<T>& t){
  IterableType<T>::classes_.insert(static_cast<T*>(this));    
}

IterableType(const IterableType<T>&& t){
  IterableType<T>::classes_.insert(static_cast<T*>(this));        
}

IterableType<T>& operator=(const IterableType<T>& t){
  return *this;
}

IterableType<T>& operator=(const IterableType<T>&& t){
  return *this;
}  


~IterableType(){
    IterableType<T>::classes_.erase(static_cast<T*>(this));
}

private:
  static std::unordered_set<T const*> classes_;
};

template <typename T>
std::unordered_set<T const*> IterableType<T>::classes_;

Edit:实现了复制和移动构造函数,并使用
向量
设置常量,这对于此任务来说效率非常低。@如果您可以将当前项与析构函数中的最后一项交换,则无需移动向量中的任何内容;它实际上相当有效。是的,你是对的。谢谢你的评论,我将尝试修复代码
class Class1:public IterableType<Class1>{
public:
  Class1(int n):n_(n)
  {}

  void print() const{
    std::cout << n_ << std::endl;
  }

private:    
  int n_;
};

int main(){
  Class1 a(3),b(7),c(8);
  for (auto i:a.allClasses()){
    i->print();
  }
  return 0;
}