Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个模板访问者真的是动态的吗? 我一直在玩各种方法,让C++中的访问者模式更具动态性,这样兄弟类就不必互相了解,这就允许以后扩展访问者层次结构。我根据Scott Meyers的“更有效的C++”提出了这个示例: class Dummy { public: void collide(int& gameobject) { } }; class DynVisitor { public: template<class Visitor=Dummy, class Arg=int> void visit(Arg& target) { Visitor* vis = dynamic_cast<Visitor*>(this); if(vis != nullptr) { vis->collide(target); } else { cerr<<"No implementation!"<<endl; } } virtual ~DynVisitor() { } }; class GameObject { public: virtual ~GameObject() { } virtual void collide(GameObject& obj) { cout<<"Default collide implementation"<<endl; } virtual void accept(DynVisitor* vis) = 0; }; class AsteroidVisitor { public: virtual void collide(Asteroid& target) = 0; virtual ~AsteroidVisitor() = 0; }; class Collider : public DynVisitor, public AsteroidVisitor { public: virtual void collide(Satellite& target) { cout<<"Satellite collision."<<endl; } virtual void collide(Spaceship& target) { cout<<"Spaceship collision."<<endl; } virtual void collide(Asteroid& target) { cout<<"Asteroid collision."<<endl; } virtual ~Collider() { } }; class Asteroid : public GameObject { public: virtual void accept(DynVisitor* visitor) { visitor->visit<AsteroidVisitor, Asteroid>(*this); } }; int main(int argc, char** argv) { DynVisitor* coll = new Collider(); GameObject* ast = new Asteroid(); ast->accept(coll); delete ast; delete coll; return 0; }; 类虚拟 { 公众: 无效碰撞(int和gameobject){} }; 类动态访问者 { 公众: 模板 无效访问(Arg和target) { Visitor*vis=dynamic_cast(本); 如果(vis!=nullptr) { 可视->碰撞(目标); } 其他的 { cerr_C++_Templates_Visitor - Fatal编程技术网 碰撞(目标); } 其他的 { cerr,c++,templates,visitor,C++,Templates,Visitor" /> 碰撞(目标); } 其他的 { cerr,c++,templates,visitor,C++,Templates,Visitor" />

这个模板访问者真的是动态的吗? 我一直在玩各种方法,让C++中的访问者模式更具动态性,这样兄弟类就不必互相了解,这就允许以后扩展访问者层次结构。我根据Scott Meyers的“更有效的C++”提出了这个示例: class Dummy { public: void collide(int& gameobject) { } }; class DynVisitor { public: template<class Visitor=Dummy, class Arg=int> void visit(Arg& target) { Visitor* vis = dynamic_cast<Visitor*>(this); if(vis != nullptr) { vis->collide(target); } else { cerr<<"No implementation!"<<endl; } } virtual ~DynVisitor() { } }; class GameObject { public: virtual ~GameObject() { } virtual void collide(GameObject& obj) { cout<<"Default collide implementation"<<endl; } virtual void accept(DynVisitor* vis) = 0; }; class AsteroidVisitor { public: virtual void collide(Asteroid& target) = 0; virtual ~AsteroidVisitor() = 0; }; class Collider : public DynVisitor, public AsteroidVisitor { public: virtual void collide(Satellite& target) { cout<<"Satellite collision."<<endl; } virtual void collide(Spaceship& target) { cout<<"Spaceship collision."<<endl; } virtual void collide(Asteroid& target) { cout<<"Asteroid collision."<<endl; } virtual ~Collider() { } }; class Asteroid : public GameObject { public: virtual void accept(DynVisitor* visitor) { visitor->visit<AsteroidVisitor, Asteroid>(*this); } }; int main(int argc, char** argv) { DynVisitor* coll = new Collider(); GameObject* ast = new Asteroid(); ast->accept(coll); delete ast; delete coll; return 0; }; 类虚拟 { 公众: 无效碰撞(int和gameobject){} }; 类动态访问者 { 公众: 模板 无效访问(Arg和target) { Visitor*vis=dynamic_cast(本); 如果(vis!=nullptr) { 可视->碰撞(目标); } 其他的 { cerr

这个模板访问者真的是动态的吗? 我一直在玩各种方法,让C++中的访问者模式更具动态性,这样兄弟类就不必互相了解,这就允许以后扩展访问者层次结构。我根据Scott Meyers的“更有效的C++”提出了这个示例: class Dummy { public: void collide(int& gameobject) { } }; class DynVisitor { public: template<class Visitor=Dummy, class Arg=int> void visit(Arg& target) { Visitor* vis = dynamic_cast<Visitor*>(this); if(vis != nullptr) { vis->collide(target); } else { cerr<<"No implementation!"<<endl; } } virtual ~DynVisitor() { } }; class GameObject { public: virtual ~GameObject() { } virtual void collide(GameObject& obj) { cout<<"Default collide implementation"<<endl; } virtual void accept(DynVisitor* vis) = 0; }; class AsteroidVisitor { public: virtual void collide(Asteroid& target) = 0; virtual ~AsteroidVisitor() = 0; }; class Collider : public DynVisitor, public AsteroidVisitor { public: virtual void collide(Satellite& target) { cout<<"Satellite collision."<<endl; } virtual void collide(Spaceship& target) { cout<<"Spaceship collision."<<endl; } virtual void collide(Asteroid& target) { cout<<"Asteroid collision."<<endl; } virtual ~Collider() { } }; class Asteroid : public GameObject { public: virtual void accept(DynVisitor* visitor) { visitor->visit<AsteroidVisitor, Asteroid>(*this); } }; int main(int argc, char** argv) { DynVisitor* coll = new Collider(); GameObject* ast = new Asteroid(); ast->accept(coll); delete ast; delete coll; return 0; }; 类虚拟 { 公众: 无效碰撞(int和gameobject){} }; 类动态访问者 { 公众: 模板 无效访问(Arg和target) { Visitor*vis=dynamic_cast(本); 如果(vis!=nullptr) { 可视->碰撞(目标); } 其他的 { cerr,c++,templates,visitor,C++,Templates,Visitor,所有对象都可能相互碰撞,因此它们仍然需要成为彼此的访问者,因此没有添加“动态”。DynVisitor是一个模板,因此需要位于翻译单元中,并且每次都会重新编译。事实上,在本例中,DynVisitor没有任何好处,因为accept()函数可以调用collide()函数,而不是template visit()函数。您的示例中没有Asteroid类,因此最简单的填充方法是Asteroid通过调用collide()实现accept在parameter对象上。这意味着DynVisitor不会成为故事的一部分

所有对象都可能相互碰撞,因此它们仍然需要成为彼此的访问者,因此没有添加“动态”。DynVisitor是一个模板,因此需要位于翻译单元中,并且每次都会重新编译。事实上,在本例中,DynVisitor没有任何好处,因为accept()函数可以调用collide()函数,而不是template visit()函数。

您的示例中没有Asteroid类,因此最简单的填充方法是Asteroid通过调用collide()实现accept在parameter对象上。这意味着DynVisitor不会成为故事的一部分。假设正确吗?顺便问一下:你在说MEC++中的哪个项目?我在我的副本中找不到任何匹配的项目…是的,假设是正确的(我在上面添加了这个)。这将是MEC++中的项目31,“使函数与多个对象相关"谢谢,我忽略了那个项目。事实上,使用AsteroidVisitor界面的目的是为了证明ABC不需要知道任何东西,除了asteroid,asteroid不需要知道任何东西,除了DynVisitor,从而使宇宙飞船不必知道asteroid。例如,我在translat上看到了你的观点离子单位,这确实回答了我的问题。谢谢。