0

我想创建一个结构,我可以在其中“迭代”一个类的所有对象(可能还有所有派生类的对象,尽管这被忽略了)。但是它不应该遍历“父”类:

假设我有以下系统:

A是基类
CD派生自
E派生自C

现在,如果我要“迭代 D”,我想迭代 D,而不是 a。然而,同样我希望能够“迭代 C”——这将让我迭代所有“C”对象——可能还有所有 E 对象(虽然这不是必需的,但也不错) .

我怎样才能做到这一点?

我尝试通过放置一个名为“myObjects”的静态变量来链接所有对象。但是我很快注意到我不能在派生类中重载静态变量。(因此 C 的“myObjects”与 A 或 D 的“myObjects”相同)

4

4 回答 4

2
int count = std::accumulate(x.begin(), x.end(), 0, [](int current_count, A* a)
                           {
                             if (dynamic_cast<D*>(a)) ++current_count;
                             return current_count;
                           });

应该做的伎俩。

如果您没有可用的 lambda,那么您当然必须将所有这些都放在一个真正的函数中。

count_if 版本:

auto count = std::count_if(x.begin(), x.end(), [](A* a) { return dynamic_cast<D*>(a) != 0; });

如果你没有 auto 那么你需要声明类型:std::iterator_traits<X_type::iterator>::difference_type

您可以尝试分配给,int但如果我没看错,difference_type可以是任何整数类型,并可能导致警告/溢出。值得怀疑的是,一个 static_cast 会解决它。

如果您只想调用 D* 上的一些操作,请使用 foreach 和上述方法来执行此操作。您可能想要查看各种访问者模式。

于 2010-11-17T20:55:04.707 回答
0

在 A 和它的孩子之间建立一个抽象类中介。把你的静态对象放在那里。然后从中派生类,而不是直接从 A 派生类。例如:

class A {};


 // make this class abstract, or not
class subA : A {
    static std::list<subA *> list_;
};

class C : subA {};
class D : subA {};
于 2010-11-17T20:46:01.300 回答
0

您可以通过每个包含static该类实例容器的类来完成这项工作,该类实例没有子类。

然后在构造时,每个类都提供一个protected供子类使用的构造函数,以及一个public用于创建非继承实例的构造函数。每个类中的protected构造函数都不会添加this到实例的容器中,而public构造函数会添加this到容器中。

这样,每个类中的静态容器只包含那些没有子类的类实例。可以在每个子类中重写基类中用于访问实例列表的虚函数以访问特定于类的容器。

破坏和复制构造必须足够聪明才能正确维护容器。

于 2010-11-17T20:48:57.163 回答
0

但是我很快注意到我不能在派生类中重载静态变量

当然不是,你不能重载任何变量。重载仅适用于函数,因为它们的签名可能不同。

您可以在基类中使用一个构造函数,该构造函数bool指示是否将对象放入“已知对象列表”并false作为默认值提供。然后只在派生类内部调用该构造函数,true其对象实际上应该插入到列表中。

但可能有一个更好的解决方案,即放弃继承而支持政策。

于 2010-11-17T20:39:07.737 回答