我的印象是标题守卫解决了重新定义的问题.我收到链接器错误,说明.obj文件中有重新定义.这是我所包含的标题,问题在于重新定义所有全局声明.
#ifndef DIRECT3D_H
#define DIRECT3D_H
// global declarations
ID3D10Device* device;
ID3D10Buffer* pBuffer;
ID3D10Buffer* iBuffer; // the pointer to the index buffer
ID3D10RenderTargetView* rtv; // the pointer to the render target view
ID3D10DepthStencilView* dsv; // the pointer to the depth stencil view
IDXGISwapChain* swapchain; // the pointer to the swap chain class
ID3D10Effect* pEffect;
ID3D10EffectTechnique* pTechnique;
ID3D10EffectPass* pPass;
ID3D10InputLayout* pVertexLayout;
ID3D10EffectMatrixVariable* pTransform; // the pointer to the effect variable interface
D3D10_PASS_DESC PassDesc;
// function prototypes
void initD3D(HWND hWnd);
void render_frame();
void …Run Code Online (Sandbox Code Playgroud) 当我已经包含相关的头文件时,为什么我需要为类使用前向声明?它解决了我的问题,但困惑了我!
基本上A级需要了解B级,反之亦然.在我包含前向声明之前,我收到错误"sytax error - identifier".我的印象包括一个头文件,本质上意味着你在声明你放置#include的另一个类.
我在'vector'类中出现错误,比如你在#include <vector>时访问的类
我得到的错误主要是:
错误1错误C2259:'Gun':无法实例化抽象类
这个类,Gun,确实是抽象的,但是我已经检查了代码,并且在任何地方都没有尝试创建它的实例.有什么,是一些定义
矢量<枪>等等;
作为将由派生类填充的类实例成员,以便我可以使用它们的多态函数.
虽然我无法访问矢量类来改变它(即使我可以不想),我可以看到错误发生在它的代码的哪一部分:
这个块的第一行:
void resize(size_type _Newsize, _Ty _Val)
{ // determine new length, padding with _Val elements as needed
if (size() < _Newsize)
_Insert_n(end(), _Newsize - size(), _Val);
else if (_Newsize < size())
erase(begin() + _Newsize, end());
}
Run Code Online (Sandbox Code Playgroud) 在回答这个问题时,我被告知我的问题在于调用下面代码中的复制构造函数.但是,我只是看不到它被调用的位置.我没有做任何事情,agents[1] = agents[0];虽然显然我不明白.这种复制发生在哪里?如何更改它,以便每次只创建新对象?
我已经
int main()
{
Level* level;
std::vector<Agent> agents;
level = new Level(agents);
for (int i = 0; i < 1; i++) // this will be more than 1 in the future.
{
agents.push_back(Agent(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f)));
}
delete level;
}
Run Code Online (Sandbox Code Playgroud) 您必须明确列出要在复制构造函数中复制的所有成员,这意味着您可以设置复制构造函数来复制对象的缩减版本.
但成员函数复制如何工作?是否自动包含所有成员函数?这是因为一个对象实际上只是成员而且函数只是声明了如何使用一个类?这是否意味着您可以在理论上使用复制构造函数创建剪切对象,然后,例如,调用getter来获取副本中不存在的成员?
有没有办法可以获得迭代器的计数?
所以,如果一开始我有这个:
for (int i = 0; iter < agents.size(); ++i)
{
agents[i]->Index(i);
}
Run Code Online (Sandbox Code Playgroud)
请记住Index()设置一个整数,我将如何使用迭代器?
for (std::vector<Agent*>::iterator iter = agents.begin(); iter < agents.end(); ++iter)
{
(*iter)->Index(????)
}
Run Code Online (Sandbox Code Playgroud) 例如:
int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )
Run Code Online (Sandbox Code Playgroud)
WINAPI 是一个如下所示的定义:
#define WINAPI __stdcall
Run Code Online (Sandbox Code Playgroud)
你为什么不能这样做:
int __stdcall WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )
Run Code Online (Sandbox Code Playgroud)
实际上我认为我的问题是我有点混淆了 typedef 的定义。谁可以给我解释一下这个?该定义的作用是什么?为什么不能在其位置编写 __stdcall ?
我想要一个集合,将浮点数的键值对存储到整数(浮点数是关键).然后我想找到具有最小数字的键值对.所以,我基本上想要使用最低的关联浮点值来获取int值.
也许是一个集合,它根据键保持它们的顺序,并允许我索引它,以便在索引0抓取对象是合适的?我不知道从哪里开始寻找这个.
例如,您的构造函数可能如下所示:
myClass::myClass(Mesh &mesh) : baseClass(mesh)
{
pointer = new Thing(mesh);
}
Run Code Online (Sandbox Code Playgroud)
mesh没有保存在myClass中,也没有在baseClass中保存的网格的getter.这只是必须在基类中实现getter的情况吗?
例如,你不能这样做:
myClass::myClass(const myClass& original) : baseClass(mesh) //there is no mesh
{
pointer = new Thing(mesh); //mesh is no longer in the parameter list
}
Run Code Online (Sandbox Code Playgroud)
编译器在为这些类创建默认复制构造函数时如何制作此副本?或者这是一个需要复制构造函数的情况?网格不是大脑的私人成员,并且没有吸气剂,所以我们如何制作新的东西?
编辑 - 通过添加更新问题 Thing