簡體   English   中英

如何獲取靜態const屬性的地址?

[英]How to get the address of a static const property?

我正在從DirectX調用以下函數:

d3dDevice->CreateBuffer( &ibd, &isrd, &Player::indexbuffer);

索引緩沖區的聲明如下:

static const ComPtr<ID3D11Buffer> indexbuffer;

編譯器拋出:

Error   1   error C2664: 'HRESULT ID3D11Device::CreateBuffer(const D3D11_BUFFER_DESC *,const D3D11_SUBRESOURCE_DATA *,ID3D11Buffer **)' : cannot convert argument 3 from 'const Microsoft::WRL::ComPtr<ID3D11Buffer>' to 'ID3D11Buffer **'

我該如何做這樣的事情? 我只需要一個常量緩沖區變量。

http://msdn.microsoft.com/zh-CN/library/windows/desktop/ff476501(v=vs.85).aspx

播放器

#pragma once

#include "StructVertex.h"
#include "SquareVertices.h"
#include "WICTextureLoader.h"

using namespace Microsoft::WRL;
using namespace DirectX;
//using namespace DirectX;

class Player : public SquareVertices
{
public:
    Player( ComPtr<ID3D11Device1> d3dDevice );
    ~Player();

    void Initialize();
    void Update();

    float x;
    float y;
    float z;
    float rotation;
    float velocity;

    static const ComPtr<ID3D11Buffer> vertexbuffer;
    static const ComPtr<ID3D11Buffer> indexbuffer;
    static const ComPtr<ID3D11ShaderResourceView> texture;
private:
    const ComPtr<ID3D11Device1> d3dDevice;
};

Player.cpp

#include "pch.h"

#include "Player.h"

//const VertexPositionColor vertices[ ];

Player::Player( ComPtr<ID3D11Device1> d3dDevice )
:
    x( 0.0f ),
    y( 0.0f ),
    rotation( 0.0f ),
    velocity( 0.05f ),
    d3dDevice( d3dDevice )
{}

Player::~Player( )
{
}

void Player::Initialize( )
{
    // Create vertex buffer
    D3D11_BUFFER_DESC bd = { 0 };
    bd.ByteWidth = sizeof( VERTEX )* ARRAYSIZE( Player::vertices );
    bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;

    D3D11_SUBRESOURCE_DATA srd = { Player::vertices, 0, 0 };

    d3dDevice->CreateBuffer( &bd, &srd, Player::vertexbuffer ); // doesn't work

    // Create the index buffer
    D3D11_BUFFER_DESC ibd = { 0 };
    ibd.ByteWidth = sizeof( short )* ARRAYSIZE( Player::indices ); // doesn't work      ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;

    D3D11_SUBRESOURCE_DATA isrd = { Player::indices, 0, 0 };

    d3dDevice->CreateBuffer( &ibd, &isrd, Player::indexbuffer ); // doesn't work    
    // Load the texture
    CreateWICTextureFromFile( d3dDevice.Get( ), nullptr, L"Wood.png", nullptr, Player::texture, 0 ); // doesn't work    }

void Player::Update()
{
    if( Keyboard::up )
        y += velocity;
    if( Keyboard::down )
        y -= velocity;
    if( Keyboard::left )
        x -= velocity;
    if( Keyboard::right )
        x += velocity;
}
&Player::indexbuffer

實際上,這是獲取靜態成員對象地址的正確方法。

正如您的錯誤消息所解釋的那樣,問題在於它的CreateBuffer函數類型錯誤,該函數需要ID3D11Buffer **類型的指針。

使用ComPtr很好,因為它會覆蓋&運算符,以返回其持有的內部指針的地址。

但是, indexbuffer聲明為const ,但是CreateBuffer()需要一個非const指針。 它更新指針以指向要返回的新緩沖區對象。 在const ComPtr<ID3D11Buffer>實例上調用&將返回const ID3D11Buffer**指針,這不是CreateBuffer()所期望的。

刪除const 在非常量ComPtr<ID3D11Buffer>上調用&將返回一個非常量ID3D11Buffer** ,這就是CreateBuffer()所期望的。

設計

問問自己這些簡單的問題:

  1. 為什么要讓緩沖區是靜態的?
  2. 你為什么要讓你的緩沖區是常量?

Static

在C ++中,我們嘗試避免使用static變量,因為它們會帶來許多問題:全局狀態,共享和所有權,初始化順序,生存期,線程安全性等。在Player類中您是否真的有很好的理由? xyz以及rotationvelocity都不是static 那么為什么要使用static緩沖區呢?


Const

所有“更改”方法都要求傳遞的對象為非常量。

想一想: CreateBuffer()必須改變緩沖區的內部狀態以對其進行初始化:分配字段,將緩沖區的數據發送到視頻卡等。但是它不能,因為它是const 當您想要UpdateSubresource()它也會失敗。 與紋理相同。 您如何將數據加載到只讀對象中?

那么什么目的的const內斯在這里? 如果希望D3D11資源不可變,則只需在初始化時聲明D3D11_USAGE_IMMUTABLE標志即可。


希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM