Собственные типы typedef с ошибкой в ​​C4430 - PullRequest
2 голосов
/ 03 апреля 2012

В академическом проекте я пытаюсь настроить простой физический движок. Я использую библиотеку Eigen для расчета векторов / матриц. Я хотел бы оставаться настолько независимым, насколько я могу, от выбора библиотеки / дизайна, который я делаю, чтобы облегчить будущие изменения, поэтому я использую typedef для типов Eigen.

Файл 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, и пытаясь использовать эти typedefs:

#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) Что я здесь не так делаю?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Это хороший выбор дизайна или я неправильно понимаю, что сказал нам мой учитель?

Я думаю, вы получите много различных мнений по этому поводу,На мой взгляд, это не очень хороший выбор (за некоторыми исключениями).Я пытаюсь объяснить, почему.

  • Вам нужно будет написать много кода (может быть, один typedef для каждого типа в библиотеке).
  • Даже если вы абстрагируете использование vector3 от реального типа (Eigen::Matrix3f), вы не получите истинную независимость , потому что (за исключением операторов math ) вы будете использовать функциис прототипами, определенными в этой библиотеке (представьте, например, как определяется матрица идентичности в Eigen и Boost).
  • Использовать определенную математическую библиотеку - , а не выбор микропроектирования , он пронизывает весь ваш код, вы не можете думать о независимости с несколькими typedef.Какой следующий шаг будет?Обернуть все классы, чтобы разрешить внедрение зависимостей?Если это то, что вам нужно, возможно, вам следует начать с библиотеки, спроектированной таким образом (но я не думаю, что это обычная или даже хорошая идея для математической библиотеки).
  • Вы скрыть важные подробности .Я понимаю, что вы не хотите распространять, если ваше число с плавающей запятой одинарной или двойной точности, но это важно!Ошибки округления и точность детали , о которых вы должны позаботиться, когда будете писать код.typedef не следует использовать (но это мое мнение) для абстрагирования вашего кода или для скрытия деталей реализации.Я думаю, что его следует использовать только как ярлык для длинного определения типа или для переключения между двумя или более эквивалентными определениями.float и double не эквивалентны (и вы всегда должны думать, что вы делаете с ними).Переключение между ними может изменить результаты приложения, тогда хорошо, что вы не можете сделать это с небольшими изменениями в typedef.

Что я здесь не так делаю?

Ошибка C4430 возникает, когда вы не указываете тип возвращаемого значения функции (до VS2k5 по умолчанию было int, как в C).Вы можете получить эту ошибку, если объявите переменную неизвестного типа.В вашем случае вы включили заголовочный файл, но, возможно, он не включает Global matrix typedefs из библиотеки Eigen (он находится в заголовочном файле Core библиотеки). Отредактировано : вы включаете RigidBody.h в свой PhysicsEngine.h и наоборот, исправляете его (извлеките typedef, если вы хотите их использовать) в другой заголовочный файл и избегаете таких циклов.

1 голос
/ 03 апреля 2012

Это хороший выбор дизайна или я неправильно понимаю, что сказал нам мой учитель?

Это может быть плохой выбор дизайна, поскольку вы скрываете тот факт, что вы используете собственные типы,тем не менее вам нужно знать этот факт, чтобы использовать ваши typedefs.

Я получаю много ошибок C4430.

Подобные описания действительно раздражают меня.Ваш компилятор не просто умрет с «ошибкой C4430», он даст вам подробную информацию об ошибке, которая имеет решающее значение для поиска причины проблемы.Вы делаете все возможное, чтобы никто не помог вам, не передавая эту информацию.Не могли бы вы опубликовать сообщение first complete вместе со строкой кода, которая вызывает ошибку?

Количество ошибок не имеет значения, поскольку вероятно, что большинство ошибок происходит изта же проблема.

Так как Microsoft предупреждение C4430 читает «отсутствует указатель типа - предполагается, что int», я подозреваю, что вы забыли включить заголовочные файлы Eigen, так что компилятор не знает, чтоEigen::Vector2f is.

Попробуйте добавить #include <Eigen/Core> к PhysicsEngine.h.


Из вашего обновленного кода: у вас есть циклические зависимости.PhysicsEngine.h включает RigidBody.h и наоборот.Это нехорошо.

Я подозреваю, что при компиляции RigidBody.cpp компилятор завершит синтаксический анализ определения класса в RigidBody.h перед typedefs в PhysicsEngine.h, так что ваши пользовательские typedefs не доступны вэтот момент.

Вы, вероятно, должны удалить RigidBody.h include из PhysicsEngine.h или переместить ваши typedefs в отдельный заголовочный файл.

...