2014-05-04 121 views
0

我想製作一個紋理處理程序,以便我可以從文本文件加載紋理文件名,然後加載紋理並將它們存儲到一個矢量中,並在每當我需要畫畫。C2259:'ID3D11ShaderResourceView'無法實例化抽象類-DX11

問題是,我收到了C2259錯誤,它在編譯之前就會中斷,並且想知道是否有人可以幫我解決問題。

TextureManager.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); 
} 

謝謝:)

+0

如果您使用向量作爲對象成員,但不知道COM指針如何工作,則需要了解所有這些指針。我有一種感覺,你會泄漏大量的記憶。這個指針需要在'〜destruct'或'&reused'時釋放。在這種情況下加指針屬性是沒有意義的,因此您需要了解如何創建,銷燬C++對象以及指針如何工作。否則...它不會很漂亮。因此,使用COM包裝器來安全地使用COM指針。 – CodeAngry

回答

1

由於ID3D11ShaderResourceView是一個接口,你必須使用一個指針來訪問這些樣的物體。所以:

std::vector<ID3D11ShaderResourceView*> * textures; 

順便說一句,你確定要使用vector終場?我沒有看到爲什麼一個簡單的vector<...>是不夠的。

然後加載紋理時,把指針的向量:

textures.push_back(temp); 

不要刪除您剛剛創建的質感。

+0

謝謝,只用它在std :: vector 紋理上工作; – JamesLJ

相關問題