Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取静态常量属性的地址?_C++_Pointers_Reference_Directx - Fatal编程技术网

C++ 如何获取静态常量属性的地址?

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

我正在从DirectX调用以下函数:

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

删除
常量
。对非常量
ComPtr
调用
&
将返回一个非常量
ID3D11Buffer**
,这正是
CreateBuffer()
所期望的。

问自己以下几个简单的问题:

  • 为什么您希望缓冲区是静态的
  • 为什么要将缓冲区设置为常量

  • 静态
    ? <>在C++中,我们试图避免<代码>静态< /代码>变量,因为它们引入了很多问题:全局状态、共享和所有权、初始化顺序、生存期、线程安全性等。在播放器< /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