gpt4 book ai didi

c++ - 从多个类中检索集合的值,正确的方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 14:16:45 26 4
gpt4 key购买 nike

首先,感谢阅读!

我正在用 C++ 开发一个应用程序,我需要有关设计问题的建议。让我解释一下:

我的应用程序的主类有一些集合,但其他类最终需要从其中一个集合中获取值。像这样:

class MainClass { 
private:
// Collections are internally implemented as QHash
Collection<Type1> col1;
Collection<Type2> col2;
};
class RosterUnit {
public:
RosterUnit() {
/* This method needs to get a specific value from col1 and
initialize this class with that data */
}
};

class ObjectAction {
public:
virtual void doAction() = 0;
};

class Action1 : public ObjectAction {
public:
void doAction() {
// This needs a specific value from col2
}
};

class Action2 : public ObjectAction {
public:
void doAction() {
// This needs a specific value from col1
}
};

我的第一个方法是在需要时将整个集合作为参数传递,但它对 ObjectAction 子类不太好,因为我必须传递这两个集合,如果我稍后创建另一个 ObjectAction 的子类,它需要得到一个来自其他集合的元素(假设 col3),我将不得不修改每个 ObjectAction 子类的 doAction() 签名,我认为这不太灵活。另外,假设我有一个 Dialog 并想从那里创建一个 RosterUnit。我必须将集合传递给对话框才能创建 RosterUnit。

接下来我决定在指向集合的 RosterUnit 和 ObjectAction 中使用静态变量,但我对这个解决方案不是很满意。我认为它不够灵活。

我一直在阅读有关设计模式的文章,我首先认为具有 get 函数的单例可能是一个不错的选择,但经过更多调查后,我认为这不是适合我的案例的设计。如果我使用全局变量,它会更容易并且或多或少是相同的,这似乎不是正确的方法。

那么,你能给点建议吗?

非常感谢!

最佳答案

如前所述,迭代器非常适合抽象集合的细节。但是走这条路意味着使用迭代器的对象将需要知道集合中的内容。这意味着他们将需要知道如何决定他们需要 Collection 中的哪个对象,从而增加耦合。 (更多细节在下面的工厂段落中)这是你需要考虑的事情。

另一种方法是在 MainClass 上创建访问器方法,这些方法采用某种键并从集合中返回一个对象 (findObject(key))。在内部,MainClass 方法将搜索容器并返回适当的对象。然而,要使用这种方法,您将需要访问 MainClass,或者通过前面提到的依赖注入(inject),或者可能使其成为单例(尽管在这种情况下不推荐)。

根据目前提供的信息,您的 ObjectAction 工厂引用 MainClass 可能会更好,并且作为 ObjectAction 创建逻辑的一部分,调用适当的 MainClass 访问器并将结果传递到 ObjectAction,从而将 ObjectAction 对象与 MainClass 解耦。

关于c++ - 从多个类中检索集合的值,正确的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com