我正在审查一些代码,我在标题中描述的示例上偶尔发现了很多次。从第二个对象调用外部方法时引用此传递的对象,甚至在其他地方更改,然后在另一个方法中再次通过引用使用。
最奇怪的是第二个对象从传递的第一个创建第二个对象的方法中调用方法。
我还没有做过类似的事情,但是因为我对C ++比较陌生,所以我允许人们在编写语言时可以自由地使用这么多选项......
然而,主要的问题是:这是常见做法吗?有没有技术上的理由不做这样的事情?
我添加了一个简短的例子:
TypeReturned *ClassB::GetSomething( ClassA *objectA)
{
someMethod(wm);
ClassC *objectC = new ClassC(objectA->method());
PCS->method(……, &objectA->someMethod(), objectA);
}
从objectA调用此方法。 第一次通话很正常。使用simpe传递需要参数而不是完整的类和回调来解决第二个和第三个更易读的问题。 我还可以说,那两个类并没有真正相互通信,也没有交叉引用。
答案 0 :(得分:0)
AFAIK技术上非常好,并且一直都在发生。有时它是“最好”的方式,不管你信不信,这是最清晰的方式。
答案 1 :(得分:0)
我认为(虽然,我无法分辨并且很高兴被证明是错误的)你所描述的是double dispatch的方案类似物(C#中的例子)。如果我是正确的,你会看到如下电话:
class LivenessPingMessage : public Message {
public:
void accept(Controller& c) {
c.visit(this);
}
}
class Controller {
public:
handleNetworkQueue() {
while (true) {
Messages::Message* m = networkLayer->getNextMessage();
if (m != NULL) {
m->accept(*this);
}
}
}
void visit(Messages::LivenessPingMessage* m) {
//Do something
}
}
class Message {
public:
virtual void accept(Controller& c) = 0;
}
这允许类Controller通过调用它们具有的虚拟accept()
方法来处理消息。然后,这些消息使用指向Controller的指针来调用重载方法visit(Message m)
。
这意味着消息只需要了解控制器,而不需要知道有关它们应该完成的任务的任何其他细节。 Controller包含适当处理消息所需的所有逻辑。
在喜欢双重发送并且是公认的设计模型的人中很常见。
答案 2 :(得分:0)
也许主要问题应该分为更多:这是通常和实际的解决方法,将自己传递给C ++中的另一个对象吗?
这既常见又实用。通常,它是实现某些目标的最自然的方式。例如,如果您希望从两端可以导航父子,那么父对象最容易在创建后将自身(this
)传递给子对象,以便它将对父对象的引用存储起来。注册self以进行回调(如在观察者模式中)是另一个例子。
这通常很有用,而不是C ++特有的。