如何获取静态const属性的地址?

时间:2014-01-07 00:07:37

标签: c++ pointers reference directx

我从DirectX调用以下函数:

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

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/en-us/library/windows/desktop/ff476501(v=vs.85).aspx

Player.h

#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;
}

3 个答案:

答案 0 :(得分:0)

&Player::indexbuffer

实际上是获取静态成员对象地址的正确方法。

正如您的错误消息所解释的那样,问题是CreateBuffer函数的类型错误,需要类型为ID3D11Buffer **的指针。

答案 1 :(得分:0)

使用ComPtr很好,因为它会覆盖&运算符以返回它所持有的内部指针的地址。

但是,indexbuffer声明为const,但CreateBuffer()需要非常量指针。它更新指针以指向要返回的新缓冲区对象。在const &实例上调用ComPtr<ID3D11Buffer>将返回一个const ID3D11Buffer**指针,这不是CreateBuffer()所期望的。

删除const。在非const &上调用ComPtr<ID3D11Buffer>将返回非常量ID3D11Buffer**,这是CreateBuffer()所期望的。

答案 2 :(得分:0)

设计

问自己这些简单的问题:

  1. 为什么您希望缓冲区是静态的?
  2. 为什么你希望你的缓冲区是const?

  3. Static

    在C ++中,我们尝试避免static变量,因为它们引入了许多问题:全局状态,共享和所有权,初始化顺序,生命周期,线程安全等等。您在{{{ {1}}课程? Playerxyzrotation都不是velocity。那么为什么static缓冲?


    static

    所有“更改”方法都要求传递的对象为非const。

    考虑一下:Const必须改变缓冲区的内部状态以初始化它:分配字段,将缓冲区的数据发送到视频卡等等。但它不能,因为它是CreateBuffer()。如果你想const它也会失败。与纹理相同。如何将数据加载到只读对象中?

    那么UpdateSubresource()的目的是什么?如果您希望D3D11资源是不可变的,只需在初始化时声明const标志。


    希望它有所帮助。