2

少し前に c++ で仮想クラスを使用する方法を尋ねましたが、残念なことに、それができないことを知りました。しかし、1 人のユーザー (つまり、「Emilio Garavaglia」に感謝します) は、追加のコードだけで、仮想クラスに似たものを取得する方法を投稿しました。ただし、コンパイルするために行っていることを取得するのに問題があります。コードは次のとおりです。

global_defs.h

#define Interface class

#define abstract_class class

#define implements : public 

I_Graphics.h

#ifndef I_GRAPHICS_H
#define I_GRAPHICS_H

#include <string>
#include "global_defs.h"

Interface I_Graphics
{
public:
    virtual ~I_Graphics() {};

    virtual void Initialize() = 0;
    virtual void Frame() = 0;
    virtual void Shutdown() = 0;

    class I_Model;

    virtual I_Model * CreateModel() = 0;

};

Interface I_Graphics::I_Model
{
public:
    virtual ~I_Model() {}

    virtual void Initialize(std::string const & filename, std::string const & textureFilename) = 0;
    virtual void * GetVertexBuffer() = 0;
    virtual void * GetIndexBuffer() = 0;
};


#endif

Graphics.h

#ifndef GRAPHICS_H
#define GRAPHICS_H

#include "global_defs.h"

#include <map>
#include <string>
#include <memory>
#include "I_Graphics.h"

class Graphics implements I_Graphics
{
public:
    Graphics();
    ~Graphics();

    void Initialize();
    void Frame();
    void Shutdown();

    class Model;

    I_Model * CreateModel() {return new Model;}   // <--- compile error here

private:
    std::map <std::string, I_Model *> m_ModelList;
};

class Graphics::Model implements I_Graphics::I_Model
{
public:
    Model();
    ~Model();

    void Initialize(std::string filename, std::string textureFilename);
    void * GetVertexBuffer();
    void * GetIndexBuffer();
};

#endif

Graphics.cpp はここでは何も進んでいません。モデルのインスタンス化を機能させようとしているだけで、まだ難しい部分の作業を開始していません。

#include "Graphics.h"

Graphics::Graphics()
{

}

Graphics::~Graphics()
{
}

void Graphics::Initialize()
{

}

void Graphics::Frame()
{

}

void Graphics::Shutdown()
{

}

Graphics::Model::Model()
{

}

Graphics::Model::~Model()
{
}

void Graphics::Model::Initialize(std::string filename, std::string textureFilename)
{


}

void * Graphics::Model::GetVertexBuffer()
{
    return NULL;
}

void * Graphics::Model::GetIndexBuffer()
{
    return NULL;
}

したがって、小さなコメントにあるように、次のようなエラーが表示されます。

error C2512: 'Graphics::Model' : no appropriate default constructor available

明らかに graphics.cpp にコンストラクターがある場合。誰かがコンパイラがここで不平を言っていることを説明できますか?

編集:
それが何かを意味するかどうかはわかりませんが、MSVC の小さな赤い波線の上にマウスを置くと、「抽象クラス型 Graphics::Model のオブジェクトは許可されていません」と表示されます。...しかし、純粋な仮想メンバーがないため、抽象的ではありませんよね?

編集:
Castilho の提案で、CreateModel を以前のように graphics.h で宣言しましたが、graphics.cpp で定義したところ、より具体的なエラーが発生しましたが、まだ理由がわかりません。

error C2259: 'Graphics::Model' : cannot instantiate abstract class
1> due to following members:
1> 'void I_Graphics::I_Model::Initialize(const std::string &,const std::string &)' : is abstract
1> i_graphics.h(28) : see declaration of 'I_Graphics::I_Model::Initialize'

4

1 に答える 1

1

Model クラスを定義する前に使用しています。関数 CreateModel を別の CPP で定義すると、機能する可能性があります。

于 2012-04-23T00:11:32.863 に答える