需要帮助......
我有3个类, Manager ,它有2个指针。一对一 A 另一个 B 。 A 不知道 B ,反之亦然。
A 进行一些计算,最后将3个浮点数放入剪贴板。 接下来, B 从剪贴板中拉出3个浮点数,并进行自己的计算。 此循环由 Manager 管理并重复多次(迭代后迭代)。
我的问题: 现在,类 A 会生成一个 B 类所需的浮点数向量。这个向量可以有超过1000个值,我不想使用剪贴板将它转移到 B ,因为它会成为时间消费者,甚至是瓶颈,因为这种行为会一步一步地重复。
简单的解决方案是 B 将知道 A (设置指向 A 的指针)。 另一种方法是通过 Manager 将指针传送到向量 但我正在寻找一些不同的,更面向对象的东西,它们不会破坏 A 和 B 之间存在的分离
有什么想法吗?
非常感谢
大卫
答案 0 :(得分:9)
听起来你正在写一个生产者/消费者对,他们可以通过浮动的(可能是线程安全的)队列更容易地进行通信。
换句话说:“队列”就像您当前使用的矢量。 A和B都将引用此队列。运行计算,并将浮点数写入队列(可能一次三个,如果这是你需要的)。 B检查队列,或者可能由A“发信号通知”队列已准备就绪,并从队列中抓取浮点数来处理它们。
有关“制作人消费者”和/或“队列”的更多信息,google(或搜索Stack Overflow),您可能会发现很多有用的信息
答案 1 :(得分:3)
clipboard is a crazy way在两个实体之间传输数据。
如果B实现了一个通用接口,如IConsumer,管理器可以将此接口传递给A,A可以直接使用有效负载调用B的方法:
class IConsumer {
public:
virtual void consume(const vector<float>& data) = 0;
};
class B: public IConsumer {
public:
virtual void consume(const vector<float>& data) { ... }
...
};
class A {
public:
virtual void produce(IConsumer& consumer) {
vector<float> data;
...
consumer.consume(data);
}
...
};
void Manager::tick() {
a->produce(*b);
}
答案 2 :(得分:1)
创建一个向量,并在迭代中使用“按引用传递”传递给A和B.
答案 3 :(得分:1)
弘(A.method());
答案 4 :(得分:0)
一旦您意识到class A
和class B
都不应该用来管理共享数据存储,问题就解决了,因为它不是唯一的。因此,你应该假设Manager
应该这样做。
为了获得最佳性能,请不要将指针传递给向量到A和B.而是传递原始float*
,因为这样可以节省间接级别。折衷方案是通过boost::array &
答案 5 :(得分:0)
正如已经指出的那样,只要std::vector<float>
和A
不在不同的线程中运行,就可以使用B
作为共享存储。 Manager
可以管理此存储空间。当A
开始工作时,它可以从该向量请求范围来存储它的结果。完成后,Manager
会调用B
,然后将A
之前已填充值的范围交给它。这可以避免任何复制。