C++ 如何获取静态常量属性的地址?
我正在从DirectX调用以下函数:C++ 如何获取静态常量属性的地址?,c++,pointers,reference,directx,C++,Pointers,Reference,Directx,我正在从DirectX调用以下函数: d3dDevice->CreateBuffer( &ibd, &isrd, &Player::indexbuffer); indexbuffer的声明如下: static const ComPtr<ID3D11Buffer> indexbuffer; 静态常数ComPtr indexbuffer; 编译器抛出: Error 1 error C2664: 'HRESULT ID3D11Device::Cr
d3dDevice->CreateBuffer( &ibd, &isrd, &Player::indexbuffer);
indexbuffer的声明如下:
static const ComPtr<ID3D11Buffer> indexbuffer;
静态常数ComPtr 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 **'
错误1错误C2664:“HRESULT ID3D11Device::CreateBuffer(常量D3D11\u BUFFER\u DESC*,常量D3D11\u SUBRESOURCE\u DATA*,ID3D11Buffer**)”:无法将参数3从“常量Microsoft::WRL::ComPtr”转换为“ID3D11Buffer**”
我该怎么做这样的事情呢?我只需要一个常量缓冲区变量
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;
};
#pragma一次
#包括“StructVertex.h”
#包括“squareVertexts.h”
#包括“WICTextureLoader.h”
使用名称空间Microsoft::WRL;
使用名称空间DirectX;
//使用名称空间DirectX;
职业玩家:公众玩家
{
公众:
播放器(ComPtr d3dDevice);
~Player();
void初始化();
无效更新();
浮动x;
浮动y;
浮动z;
浮动旋转;
浮速;
静态常量ComPtr vertexbuffer;
静态常数ComPtr indexbuffer;
静态常数ComPtr纹理;
私人:
康斯特公司;
};
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;
}
#包括“pch.h”
#包括“Player.h”
//常量顶点曝光颜色顶点[];
播放器::播放器(ComPtr d3dDevice)
:
x(0.0f),
y(0.0f),
旋转(0.0f),
速度(0.05f),
d3dDevice(d3dDevice)
{}
玩家::~Player()
{
}
void播放器::初始化()
{
//创建顶点缓冲区
D3D11_BUFFER_DESC bd={0};
bd.ByteWidth=sizeof(顶点)*ARRAYSIZE(播放器::顶点);
bd.BindFlags=D3D11_BIND_VERTEX_BUFFER;
D3D11_子资源_数据srd={Player::vertices,0,0};
d3dDevice->CreateBuffer(&bd,&srd,Player::vertexbuffer);//不工作
//创建索引缓冲区
D3D11_BUFFER_DESC ibd={0};
ibd.ByteWidth=sizeof(short)*ARRAYSIZE(Player::INDEX);//不工作ibd.BindFlags=D3D11_BIND_INDEX_BUFFER;
D3D11_子资源_数据isrd={Player::index,0,0};
d3dDevice->CreateBuffer(&ibd,&isrd,Player::indexbuffer);//不工作
//加载纹理
CreateWictTextureFromFile(d3dDevice.Get(),nullptr,L“Wood.png”,nullptr,Player::texture,0);//不起作用}
void Player::Update()
{
如果(键盘::向上)
y+=速度;
如果(键盘::向下)
y-=速度;
如果(键盘::左)
x-=速度;
如果(键盘::右)
x+=速度;
}
实际上是获取静态成员对象地址的正确方法
正如错误消息所解释的,问题在于它的
CreateBuffer
函数的类型错误,该函数需要类型为ID3D11Buffer**
的指针。使用ComPtr
可以,因为它会覆盖&
操作符以返回它所持有的内部指针的地址
但是,indexbuffer
声明为const
,但是CreateBuffer()
需要一个非常量指针。它更新指针以指向返回的新缓冲区对象。在constComPtr
实例上调用&
将返回一个constID3D11Buffer**
指针,这不是CreateBuffer()
所期望的
删除常量
。对非常量ComPtr
调用&
将返回一个非常量ID3D11Buffer**
,这正是CreateBuffer()
所期望的。
问自己以下几个简单的问题:
静态
?
<>在C++中,我们试图避免<代码>静态< /代码>变量,因为它们引入了很多问题:全局状态、共享和所有权、初始化顺序、生存期、线程安全性等。在xyz
,还是旋转
和速度
都不是静态
。那么为什么静态缓冲区呢
Const
?
所有“更改”方法都要求传递的对象为非常量
想想看:CreateBuffer()
必须改变缓冲区的内部状态来初始化它:分配字段,将缓冲区的数据发送到显卡,等等。但它不能,因为它是常量。当您想更新subresource()
时,它也会失败。纹理也一样。如何将数据加载到只读对象中
那么const
ness的目的是什么呢?如果希望D3D11资源是不可变的,只需在初始化时声明D3D11\u USAGE\u immutable
标志
希望能有所帮助。如果我不使用ComPtr,你有什么想法吗?它不喜欢记录对象的数量吗?就像任何好的智能指针一样,ComPtr
覆盖&
操作符以返回它在ot上保持的内部指针的地址。因此,ComPtr::operator&()
返回一个ID3D11Buffer**
。这不是错误的原因。真正的原因是indexbuffer
被声明为const
。您需要去掉它,以允许CreateBuffer()
更改indexbuffer
的内容。
&Player::indexbuffer