:私は2つのクラス持っMovableObjectとGravitySourceをから継承されたことをMovableObject(GravitySourcesがあまりにも移動することができますので)。でMovableObject I機能は持っている統合GravitySourcesのリストを使用して、その計算の移動のparamsを。したがって、GravitySourcesのリストをこの関数に入れることはできません。また、GravitySourceでMovableObject関数(integrateを含む)の複製を作成したくありません。では、この問題をどのように解決するのでしょうか?C ++です。
あなたのMovableObject::integrate
関数宣言を取ることができMovableObject*
、パラメータとしてのようなものを指すポインタを:
return_type MovableObject::integrate(Movable* );
この方法では、あなたが渡すことができますGravitySources
しMovable::integrate
、そして行動が多型となり、あなたがアクセスしていすなわちvirtual
ベースへのポインタを介した機能をMovableObject*
。したがってvirtual
、ベースへのポインタを介して呼び出すことができるいくつかの一般的な関数があることを確認し、それらに作業を委任します。
の配列を渡したい場合GravitySources
は、MovableObject*
ポインタを使用してGravitySources
配列内を安全に移動できないため、少し注意が必要です。あなたができることは、クラスを前方宣言するGravitySources
ことです、そしてあなたは宣言することができます
return_type MovableObject::integrate(GravitySources* );
ポインタを介して不完全な型を使用できるため、上記の宣言は問題ありません。関数の実装がの完全な定義の後に来ることを確認してくださいGravitySources
。これで、の配列をGravitySources
関数に渡すことができます。
以下のおもちゃの例:
#include <iostream>
class GravitySources; // need this forward declaration
class MovableObject
{
public:
void integrate(GravitySources* gs, std::size_t N); // process N GravitySources
virtual void f(); // our common virtual interface
virtual ~MovableObject() = default;
};
class GravitySources: public MovableObject
{
int _label; // label the instance
public:
GravitySources(int label): _label(label) {}
void f() override;
};
void MovableObject::integrate(GravitySources* gs, std::size_t N)
{
// process the GravitySources
for (std::size_t i = 0; i < N; ++i)
{
gs[i].f();
}
}
void MovableObject::f()
{
std::cout << "MovableObject::f()" << std::endl;
}
void GravitySources::f()
{
std::cout << "GravitySources::f() " << _label << std::endl;
}
int main()
{
MovableObject mo;
GravitySources gs[3] {1, 2, 3}; // 3 GravitySources
mo.integrate(gs, 3); // process them
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加