2

学術プロジェクトで、単純な物理エンジンをセットアップしようとしています。ベクトル/行列の計算に Eigen ライブラリを使用しています。将来の変更を容易にするために、私が行っているライブラリ/デザインの選択からできるだけ独立したいので、Eigen 型に typedef を使用しています。

ファイル PhysicsEngine.h

#pragma once

#include <Eigen/Core>
#include <Eigen/Geometry>
#include "RigidBody.h"

... other inclusions ...

namespace PhysicsEngine
{
    typedef float real;
    typedef Eigen::Vector3f vector3;
    typedef Eigen::Quaternionf quaternion;
    typedef Eigen::Matrix4f matrix4;
    typedef Eigen::Matrix3f matrix3;

    ...

1) それは良いデザインの選択ですか、それとも先生が私たちに言ったことを誤解していますか?

上記のファイルを RigidBody.h に含め、これらの typedef を使用しようとしています。

#pragma once

#include "PhysicsEngine.h"

namespace PhysicsEngine
{
    class RigidBody
    {
    public:
    vector3 position;               // <- error C4430
    real inverseMass;               // <- error C4430
    vector3 velocity;               // <- error C4430
    vector3 netForce;               // <- error C4430

    quaternion orientation;         // <- error C4430
    matrix3 inverseInertiaTensor;   // <- error C4430
    vector3 rotation;               // <- error C4430
    vector3 netTorque;              // <- error C4430

    matrix4 transformationMatrix;   // <- error C4430
    ...

私は得る:

エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int をサポートしていません。

2) ここで何が間違っていますか?

前もって感謝します。

4

2 に答える 2

1

それは良いデザインの選択ですか、それとも私の先生が私たちに言ったことを誤解していますか?

Eigen型を使用しているという事実を隠すため、設計上の選択としては不適切かもしれませんが、typedefを使用するには、この事実を知る必要があります。

C4430で多くのエラーが発生します。

そのような説明は本当に私を苛立たせます。コンパイラは「エラーC4430」で死ぬだけでなく、問題の原因を見つけるために重要な詳細なエラー情報を提供します。あなたは、この情報を共有しないことによって、だれもあなたを助けることを難しくしています。エラーの原因となっているコード行とともに、最初の完全なメッセージを投稿していただけますか?

ほとんどのエラーは同じ問題に起因する可能性が高いため、エラーの数は関係ありません。

Microsoftの警告C4430には「型指定子がありません-intが想定されています」と書かれているので、Eigenヘッダーファイルをインクルードするのを忘れているのではないかと思いますEigen::Vector2f

に追加#include <Eigen/Core>してみてくださいPhysicsEngine.h


更新されたコードから:循環依存関係があります。 PhysicsEngine.h含むRigidBody.h、またはその逆。これは良くない。

コンパイル中に、コンパイラがのtypedefの前にRigidBody.cppクラス定義を解析することになり、その時点でカスタムtypedefを使用できなくなるのではないかと思います。RigidBody.hPhysicsEngine.h

おそらく、RigidBody.hインクルードをから削除するPhysicsEngine.hか、typedefを別のヘッダーファイルに移動する必要があります。

于 2012-04-03T08:13:23.357 に答える
1

それは良いデザインの選択ですか、それとも先生が私たちに言ったことを誤解していますか?

これについては、さまざまな意見があると思います。私の観点では、それは本当に良い選択ではありません (いくつかの例外があります)。その理由を説明しようとします。

  • 大量のコードを作成する必要があります(typedefライブラリ内の型ごとに 1 つかもしれません)。
  • vector3from real 型 ( Eigen::Matrix3f)の使用を抽象化しても、 (数学演算子を除いて) そのライブラリで定義されたプロトタイプで関数を使用するため、真の独立性は得られません(たとえば、恒等行列がどのように定義されているかを考えてください)。 EigenおよびBoostで)。
  • 特定の数学ライブラリを使用することは、マイクロデザインの選択ではありません。それはすべてのコードに浸透しており、少数で独立しているとは考えられませんtypedef。次のステップは何ですか?依存性注入を許可するためにすべてのクラスをラップしますか? それが必要な場合は、そのように設計されたライブラリから始める必要があるかもしれません (しかし、それは数学ライブラリにとって一般的ではなく、良い考えでさえないと思います)。
  • 重要な 詳細を非表示にします。浮動小数点数が単精度または倍精度の場合、伝播したくないことは理解していますが、それは重要です! 丸め誤差と精度は、コードを記述するときに注意する必要がある詳細です。typedefコードを抽象化したり、実装の詳細を隠したりするために使用しないでください (ただし、私の意見です)。長い型定義のショートカットとして、または2つ以上の同等の定義を切り替えるためにのみ使用する必要があると思います。floatdoubleは同等ではありません (そして、それらをどう処理するかを常に考える必要があります)。それらを切り替えると、アプリケーションの結果が変わる可能性がありますtypedef

ここで何が間違っていますか?

C4430 エラーは、関数の戻り値の型を指定しないと発生します (VS2k5 より前のデフォルトはintC のようでした)。不明な型の変数を宣言すると、そのエラーが発生する可能性があります。あなたの場合、ヘッダー ファイルを含めましたが、Eigen ライブラリのグローバル マトリックス typedefCoreが含まれていない可能性があります (ライブラリのヘッダー ファイルにあります)。
編集済み: にインクルードRigidBody.hし、PhysicsEngine.hその逆を行い、それtypedefを別のヘッダー ファイルに修正 (使用する場合は を抽出) し、このラウンドトリップを回避します。

于 2012-04-03T08:37:21.327 に答える