Невозможно переопределить абстрактную функцию CreateFont - PullRequest
2 голосов
/ 23 июня 2011

У меня есть базовый класс, и я поместил в него абстрактную функцию.Теперь я унаследовал его и объявил эту функцию в своем производном классе.Но Visual Studio по-прежнему не будет компилировать мой код и настаивает на том, что производный класс является абстрактным.Я даже скопировал и вставил объявление из базового класса, просто удалил virtual и =0 и все еще получил ошибку.Я явно уточнил все аргументы и возвращаемые значения из глобальной области видимости.Любые предложения?

#include "OS/Windows/Windows.h"

#ifdef _DEBUG
#define D3D_DEBUG_INFO
#define D3DCALL(a) Wide::Render::CheckResult(a, #a)
#else
#define D3DCALL(a) a
#endif
#define D3DXFX_LARGEADDRESS_HANDLE

extern "C" {
    Wide::Render::Render* CreateRender(Wide::OSystem::Windows::WindowsOS* ptr);
}

namespace Wide {
    namespace Render {
        class D3D9Render : public Wide::Render::Render {
            friend Render* ::CreateRender(Wide::OSystem::Windows::WindowsOS*);
            D3D9Render(Wide::OSystem::Windows::WindowsOS* os);

            Wide::Colour ScreenBackground;

        public:
            Wide::Colour GetScreenBackground();
            Render* SetScreenBackground(Wide::Colour);
            void RenderFrame();

            int GetFramesPerSecond();
            std::shared_ptr<Wide::Render::Font> GetDefaultFont();
            std::shared_ptr<Wide::Render::Font> CreateFont(
                string name, 
                int weight,
                int width, 
                int height,
                bool italic
            );
        };
    }
}

Заголовок Windows включает в себя заголовок Render, соответствующий отрывок которого размещен ниже:

namespace Wide {
    namespace Render {
        struct Font;
        struct Label {
            virtual ::Wide::string Text() = 0;
            virtual Label* Text(::Wide::string) = 0; 

            virtual std::shared_ptr<::Wide::Render::Font> Font() = 0;
            virtual Label* Font(std::shared_ptr<::Wide::Render::Font>) = 0;

            virtual Label* Position(::Wide::Rectangle) = 0;
            virtual ::Wide::Rectangle Position() = 0;

            virtual ::Wide::Colour Colour() = 0;
            virtual Label* Colour(::Wide::Colour) = 0;

            virtual ~Label() {}
        };
        struct Font {
            virtual ::Wide::string Name() const = 0;
            virtual bool Italic() const = 0;
            virtual int Weight() const = 0;
            virtual int Width() const = 0;
            virtual int Height() const = 0;
            virtual std::unique_ptr<::Wide::Render::Label> CreateLabel() = 0;

            virtual ~Font() {}
        };
        struct Texture;
        struct Sprite {        
            virtual std::shared_ptr<::Wide::Render::Texture> Texture() = 0;
            virtual Sprite* Texture(std::shared_ptr<::Wide::Render::Texture>) = 0;

            virtual Sprite* Position(::Wide::Rectangle) = 0;
            virtual ::Wide::Rectangle Position() = 0;

            virtual ::Wide::Colour Colour() = 0;
            virtual Sprite* Colour(::Wide::Colour) = 0;

            virtual float Depth() = 0;
            virtual Sprite* Depth(float) = 0;

            virtual ~Sprite() {}
        };
        struct Texture {
            virtual ::Wide::Point Size() = 0;
            virtual ::Wide::string Filepath() = 0;

            virtual std::unique_ptr<Sprite> CreateSprite() = 0;
            virtual ~Texture() {}
        };
        struct Render {
            virtual ::Wide::Colour GetScreenBackground() = 0;
            virtual Render* SetScreenBackground(::Wide::Colour) = 0;
            virtual void RenderFrame() = 0;
            virtual int GetFramesPerSecond() = 0;

            virtual std::shared_ptr<Wide::Render::Font> GetDefaultFont() = 0;
            virtual std::shared_ptr<Wide::Render::Font> CreateFont(
                string name, 
                int weight,
                int width, 
                int height,
                bool italic
            ) = 0;

            virtual ~Render() {}
        };
    }
}

Редактировать: ошибка является чрезвычайно явной.

d:\backups\code\projects\ngin4\d3d9render\d3d9render.cpp(9): error C2259: 'Wide::Render::D3D9Render' : cannot instantiate abstract class
          due to following members:
          'std::tr1::shared_ptr<_Ty> Wide::Render::Render::CreateFont(Wide::string,int,int,int,bool)' : is abstract
          with
          [
              _Ty=Wide::Render::Font
          ]
          d:\backups\code\projects\ngin4\ngin4\render.h(107) : see declaration of 'Wide::Render::Render::CreateFont'

1 Ответ

3 голосов
/ 23 июня 2011

windows.h определяет CreateFont как CreateFontW (и многие другие идентификаторы аналогичным образом), что приводит к множеству неожиданных ошибок компиляции с некоторыми порядками включения:

#define CreateFont CreateFontW

Обычный обходной путь (при условии, что вам не нужно вызывать эту функцию GDI) - отменить определение символа после включения windows.h или избежать полного использования имен таких Win32 API.

#undef CreateFont
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...