C2259:“ID3D11ShaderResourceView”无法实例化抽象类 - DX11

Posted

技术标签:

【中文标题】C2259:“ID3D11ShaderResourceView”无法实例化抽象类 - DX11【英文标题】:C2259 : 'ID3D11ShaderResourceView' Cannot instantiate abstract class - DX11 【发布时间】:2014-05-04 17:19:46 【问题描述】:

我正在尝试制作一个纹理处理程序,以便我可以从文本文件加载纹理文件名,然后加载纹理并将它们存储到向量中,并在需要绘制时获取它们。

问题是,我遇到了 C2259 错误,它在编译之前就中断了,我想知道是否有人可以帮助我。

纹理管理器.h

class TextureManager
private:
    std::vector<ID3D11ShaderResourceView> * textures;
public:
    TextureManager();
    ~TextureManager();
    void TMLoadTexture(ID3D11Device* d);
    ID3D11ShaderResourceView * TMgetTexture(int index);
;

TextureManager.cpp - TMLoadTexture / TMGetTexture

void TextureManager::TMLoadTexture(ID3D11Device* d)

    std::vector<std::string> files;
    files = readFile("textures");

    D3DX11_IMAGE_LOAD_INFO loadInfo;
    ZeroMemory(&loadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO));
    loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    loadInfo.Format = DXGI_FORMAT_BC1_UNORM;

for(int i = 0; i < files.size(); i++)

    std::wstring stemp = std::wstring(files.at(i).begin(), files.at(i).end());
    LPCWSTR sw = stemp.c_str();

    ID3D11ShaderResourceView* temp;
    D3DX11CreateShaderResourceViewFromFile(d, sw, &loadInfo, NULL, &temp, NULL);
    textures->push_back(*temp);
    delete temp;



ID3D11ShaderResourceView * TextureManager::TMgetTexture(int index)

    return &textures->at(index);

谢谢:)

【问题讨论】:

如果你使用向量作为对象成员并且不知道COM指针是如何工作的,你需要全部学习。我有一种感觉,你会泄漏很多内存。此指针需要在~destruct&amp;reused 时释放。在这种情况下加上指针属性毫无意义,因此您需要了解 C++ 对象是如何创建、销毁的以及指针是如何工作的。不然……就不好看了。所以使用 COM 包装器来保证 COM 指针的安全。 【参考方案1】:

由于ID3D11ShaderResourceView 是一个接口,您必须使用指针来访问这些对象。所以:

std::vector<ID3D11ShaderResourceView*> * textures;

顺便说一句,您确定要使用vector-指针吗?我看不出为什么一个普通的vector&lt;...&gt; 是不够的。

然后在加载纹理的时候,把指针放在向量中:

textures.push_back(temp);

并且不要删除刚刚创建的纹理。

【讨论】:

谢谢,刚刚在 std::vector 纹理中使用它;

以上是关于C2259:“ID3D11ShaderResourceView”无法实例化抽象类 - DX11的主要内容,如果未能解决你的问题,请参考以下文章

C2259:“ID3D11ShaderResourceView”无法实例化抽象类 - DX11

FeatureDetectors 不在 OpenCV 3.0.0 中?

无法启动抽象类,因为成员是抽象的

旧版 MFC 代码 (2005) 无法在 VC 2010 上编译