Как получить адрес статического свойства const?

0

Я вызываю следующую функцию из 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/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;
}
Теги:
pointers
reference
directx

3 ответа

0

дизайн

Задайте себе эти простые вопросы:

  1. Почему вы хотите, чтобы ваши буферы были статическими?
  2. Почему вы хотите, чтобы ваши буферы были const?

Static?

В C++ мы стараемся избегать static переменных, поскольку они вносят много проблем: глобальное состояние, совместное использование и владение, порядок инициализации, срок службы, безопасность потоков и т.д. У вас действительно есть веские причины для этого в вашем классе Player? Ни xyz, ни rotation и velocity не static. Итак, почему static буферы?


Const?

Все "изменяющиеся" методы требуют, чтобы объекты передавались как неконстантные.

Подумайте об этом: CreateBuffer() должен мутировать внутреннее состояние буфера для его инициализации: назначать поля, отправлять данные буфера на видеокарту и т.д. Но это не может, потому что это const. Когда вы UpdateSubresource() он также не сработает. То же самое с текстурой. Как бы вы загружали данные в объект только для чтения?

Так что цель const Несса здесь? Если вы хотите, чтобы ресурсы D3D11 были неизменяемыми, просто объявите флаг D3D11_USAGE_IMMUTABLE при инициализации.


Надеюсь, поможет.

0
&Player::indexbuffer

на самом деле является правильным способом получить адрес статического объекта-члена.

Как объясняется ваше сообщение об ошибке, проблема в том, что он имеет неправильный тип для функции CreateBuffer, для чего требуется указатель типа ID3D11Buffer **.

  • 0
    Есть ли у вас какие-либо идеи относительно того, что будет страдать, если я не буду использовать ComPtr? Разве не нравится вести учет объектов или чего-то еще?
  • 0
    Как и любой хороший интеллектуальный указатель, ComPtr переопределяет оператор & чтобы вернуть адрес внутреннего указателя, который он удерживает. Таким образом, ComPtr<ID3D11Buffer>::operator&() возвращает ID3D11Buffer** . Это не причина ошибки. Реальная причина в том, что indexbuffer объявлен как const . Вам нужно избавиться от этого, чтобы позволить CreateBuffer() изменять содержимое indexbuffer .
0

Использование ComPtr в порядке, поскольку оно переопределяет оператор & для возврата адреса внутреннего указателя, на который он удерживает.

Однако indexbuffer объявляется как const, но CreateBuffer() ожидает указатель не const. Он обновляет указатель, указывая на новый возвращаемый объект буфера. Вызов & в ComPtr<ID3D11Buffer> const ComPtr<ID3D11Buffer> возвращает указатель const ID3D11Buffer**, который не является тем, что CreateBuffer().

Удалите const. Вызов & на неконстантном ComPtr<ID3D11Buffer> вернет неконстантный ID3D11Buffer**, что и CreateBuffer().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню