我正在為一項學校作業撰寫一個簡單的物理引擎。為了通用,我們創建了一個 Particle 類,然后是一個繼承它的 Object 類(基本上是一個帶有力矢量的粒子),最后是一個 Disc 類,它是 Object 的子類。在我的 PyhsicsWorld 課程中,我想使用物件串列并對其進行迭代以解決沖突。為此,我宣告了 intersects(Object o1, Object o2) 和 GetPenDist(Object o1, Object o2) 函式,但不應呼叫它們。相反,我在 Disc 中多載了這些函式,我希望程式改為使用這些函式。我只創建和使用光碟(目前),所以我確定沒有任何理由(除了我不理解我的代碼)程式呼叫物件而不是光碟的相交。這是我的代碼:
物件.h:
#include <iostream>
#include "./Particle.h"
class Object : public Particle {
//Some code
};
bool intersects(Object o1, Object o2);
float getPenDist(Object o1, Object o2);
物件.cpp:
#include "./Object.h"
bool intersects(Object o1, Object o2) {
std::cout << "Bad Intersects" << std::endl;
return false;
}
float getPenDist(Object o1, Object o2) {
std::cout << "Bad PenDist" << std::endl;
return 0;
}
光碟.h:
#include "./Object.h"
class Disc : public Object {
protected :
float radius;
public :
float getRadius() { return radius; }
//Some code
};
bool intersects(Disc d1, Disc d2);
float getPenDist(Disc d1, Disc d2);
光碟.cpp:
#include "./Disc.h"
bool intersects(Disc d1, Disc d2) {
return (d2.getPosition() - d1.getPosition()).getNorm() < d1.getRadius() d2.getRadius();
}
float getPenDist(Disc d1, Disc d2) {
return -(d2.getPosition() - d1.getPosition()).getNorm() - d1.getRadius() - d2.getRadius();
}
物理世界.h:
class PhysicsWorld {
protected:
std::vector<Object*> objectList;
void resolveCollisions(float duration);
};
物理世界.cpp:
#include "PhysicsWorld.h"
void PhysicsWorld::resolveCollisions(float duration) {
std::vector<Object*>::iterator iter, iter2;
for (iter = objectList.begin(); iter != objectList.end(); iter) {
for (iter2 = objectList.begin(); iter2 != objectList.end(); iter2) {
if (!(*iter == *iter2))
{
if (intersects(**iter, **iter2))
{
//Do something
}
}
}
}
}
我的問題是代碼在 resolveCollisions 方法中運行 Intersects(Object*, Object*) 函式,而我希望它運行 Intersects(Disc*, Disc*) 函式。
請注意,這些類已大大簡化為僅包含相關代碼。此外,雖然我很想制作 Object::Intersects(Object o),但我不能這樣做,因為之后我無法用 Disc::Intersects(Disc d) 覆寫它。
非常感謝您提供的任何幫助!
uj5u.com熱心網友回復:
如果你真的需要呼叫 for Disc,就投它。我進一步假設您需要多種形狀的通用解決方案,如圓盤、立方體、球體等。
所以我為你準備了一個例子,它是基于虛函式的,展示了你如何為 Disc 和 Cube 選擇正確的函式。
class Disc;
class Cube;
bool intersectDiscVsDisc(Disc*, Disc*);
bool intersectCubeVsDisc(Cube*, Disc*);
bool intersectCubeVsCube(Cube*, Cube*);
class Object {
public:
virtual bool intersects(Object *) = 0;
virtual bool intersectsVsDisk(Disc *) = 0;
virtual bool intersectsVsCube(Cube *) = 0;
};
class Disc : public Object {
virtual bool intersects(Object * another) override
{ return another->intersectsVsDisk(this); }
virtual bool intersectsVsDisk(Disc * another)
{ return intersectDiscVsDisc(this, another); }
virtual bool intersectsVsCube(Cube * another)
{ return intersectCubeVsDisc(another, this); }
};
class Cube : public Object {
virtual bool intersects(Object * another) override
{ return another->intersectsVsCube(this); }
virtual bool intersectsVsDisk(Disc *another)
{return intersectCubeVsDisc(this, another); }
virtual bool intersectsVsCube(Cube *another)
{ return intersectCubeVsCube(this, another); }
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/537508.html
標籤:C 遗产运算符重载
下一篇:類不繼承時super()的用途
