c++ - 相互了解的对象集合

标签 c++ design-patterns

这是一个宽泛的问题,但根据我自己的理解,我决定将其抛出。

谁能推荐设计,甚至是普遍接受的设计模式,以应对人们希望各种对象相互感知的情况?

用人/社区模拟做类比,当你有 X 人对象,其中 X 可以动态增长/收缩,并且每个人对象都持有对另一个人的意见或关系时,最好应用什么模式对象?

在编程语法之外思考,我可以只用一个 X 乘 X 的网格来表示每个人彼此之间的关系(喜欢、不喜欢、没见过面等)。我想基本上在代码中将其实现为与每次创建新对象时都会更新的每个人对象分开的对象,但这似乎是一个完全不优雅的解决方案。这里有人有什么建议吗?

其次,如果我有一组人,每个人都有“库存”或他们携带的元素,我想我可以创建每个人的库存作为类(class)的列表成员;这个链表会随着这个人的对象的增长和收缩而增长和收缩。

可以很容易地查询 people 对象中携带的对象,但我想不出一种有效的方法来使反之亦然;也就是说,我希望能够查询一个项目并找到哪些人拥有该项目。

我确实读过这个问答: Game Objects Talking To Each Other ..但我不确定它是否完全适用于我的情况。

有人可以提供任何建议吗?

谢谢!

--R

最佳答案

您正在寻找的是一个相对简单的关联。

class Person {
    struct Relationship {
        // whatever
    };
    std::map<Person*, Relationship> relationships;
public:
    Person() {}
    void Meet(Person* other) {
        // think about it
        relationships[other] = ...;
    }
    ~Person() {
        // Loop through the map and ensure no dud relationships
        for(auto& pair : relationships) {
            pair.first->relationships.erase(this);  
        }
    }
};

至于确定拥有某些元素的人,我认为(相对)简单的管理器解决方案应该可以很好地工作,尽管我讨厌将类称为“管理器”。

class PersonManager {
    struct Item { ... };
    std::set<Item, std::set<Person*>> items; // set for no dupes
public:
    void AddToInventory(Item i, Person* p) {
        items[i].insert(p);
    }
    std::vector<Person*> PeopleWithItem(Item i) {
        return std::vector<Person*>(items[i].begin(), items[i].end());
    }
};

如果您必须以这种方式对大量关系建模,我建议您使用数据库。但是,我怀疑任何数据库都可以与此代码的效率相媲美 - 您甚至可以转到哈希容器并为大多数这些操作获得 O(1)。

关于c++ - 相互了解的对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7143976/

相关文章:

javascript - meteor :设计模式:为集合的每个字段(列)创建模板助手

java - 如何用多态替换switch?

java - 在不使用比较器的情况下按不同属性比较对象

design-patterns - 设计模式 - 事件处理

c++ - 在调用 clFinish 或 clWaitForEvents 之前,OpenCL 内核执行不会开始

c++ - 以下c++构造函数之间有什么区别?

c++ - 使用 caffe 和 Eigen 编译 C++ 代码

javascript - Javascript 中的日期选择器

c++ - 如何使用 gdb 跟踪在 main() 之前初始化的所有静态全局变量

尝试将现有数组的反向存储到另一个数组时出现 C++ 错误。不能使用指针