传递shared_ptr作为<Base>shared_ptr<Derived>
Passing shared_ptr<Base> as shared_ptr<Derived>
i当前有以下结构
class A
class B : public A
class C : public A
我在A
中定义了虚拟方法,B
和C
正在覆盖它们。这些方法是
bool C::CheckCollision(shared_ptr<B> box);
bool B::CheckCollision(shared_ptr<C> triangle);
我也有一个shared_ptr<A>
的向量,我在其中存储了所有游戏对象。问题是我不能做以下
for (int i = 0; i < objects.size(); i++)
{
for (int j=i; j < objects.size(); j++
{
objects[i]->CheckCollision(objects[j]);
}
}
我遇到了一个错误,说参数列表与超载函数不匹配。当我尝试通过shared_ptr<A>
时,我期待shared_ptr<B>
或shared_ptr<C>
的地方很有意义,但是我该如何解决这个问题?还有另一种方法吗?
让我们与虚拟函数一起使用,并共享指针
首先,您可以使用共享的指针完美地使多态性起作用。这里是一个小片段,向您展示如何做到这一点:
class A {
public:
virtual void show() { cout<<"A"<<endl; }
virtual void collide(shared_ptr<A> a) { cout<<"collide A with "; a->show(); }
virtual ~A() {}
};
class B : public A {
public:
void show() override { cout<<"B"<<endl; }
void collide(shared_ptr<A> a) override { cout<<"collide B with "; a->show(); }
};
class C : public A {
public:
void show() override { cout<<"C"<<endl; }
void collide(shared_ptr<A> a) override { cout<<"collide C with "; a->show(); }
};
您的双循环看起来像:
vector<shared_ptr<A>> objects;
objects.push_back (make_shared<A>()); // populate for the sake of demo
objects.push_back (make_shared<B>());
objects.push_back (make_shared<C>());
for (int i = 0; i < objects.size(); i++)
{
objects[i]->show();
for (int j=i; j < objects.size(); j++)
{
objects[i]->collide(objects[j]); // note that you have to use -> not .
}
}
现在,您会看到,为了掌握组合,我使用了一个了解其对象的真实类型但对合作伙伴对象的实际类型不了解的替代。因此,要确定它是哪种配对,我需要调用合作伙伴对象的多态性功能。
在线演示
您问题的更通用的方法是double dispatch
这个小的概念证明是显示一个简单的例子。当问题可以分解为问题的每个伙伴对象中,这是理想的选择。但是事情并不总是那么简单,因此您可以通过搜索 double Dispatch 来找到更多精心设计的技术。幸运的是,碰撞的例子很普遍。
在这里,另一个结合了覆盖和超载的演示。我认为这是您尝试实现的目标,但可以通过一个间接级别来解决它。它的灵感来自访问者模式:对象的多态性碰撞函数由共享指针指向合作伙伴对象的基类。但是,此函数的实现立即将合作伙伴对象的多态函数称为"参数"作为对本身的引用(即对参数的真实类型的了解,允许编译器选择正确的过载)。不幸的是,这种"反弹"方法(顺便说一句,这是一种倒置的访客)要求基础类别阶层知道其所有潜在派生类,这远非理想。但是它允许为每种可能的组合提供不同的行为。
双重调度的另一种方法是使用调度表。这是通过管理一种虚拟表但具有两种类型的方法来工作的,并且有一些查找以调用正确组合的正确功能。
- EASTL矢量<向量<int>>连续的
- 引用 std::shared:ptr 以避免引用计数
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 无法使用 libtool 将 -shared 参数传递给 g++
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- gcc -fPIC vs. -shared
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 在shared_from_this()中的错误类型(在继承类中)(是否有dyn.type-ware shared Poi
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型