我试图为可以附加到我的对象的可能元数据创建一个容器.我可以保证每类最多只有一个对象附加到我的班级,但是对于不同类型的对象没有限制.例如,我不能将两个实例附加wordInfo到一个对象,但是wordInfo和的实例phraseInfo可以同时附加到一个对象.这是我到目前为止完成的工作.
class object
{
std::map <std::type_info, object*> mMetaData;
public:
inline void attachMetaData(object* pData)
{
mMetaData[typeid(*pData)] = pData;
}
template <class T> inline std::enableif<std::is_base_of<object,T>::value, T*>::type getMetaData()
{
if (mMetaData.find(typeid(T)) == mMetaData.end())
return NULL;
else
return mMetaData[typeid(T)];
}
template <class T> inline std::enableif<std::is_base_of<object,T>::value, void>::type detachMetaData()
{
mMetaData.erase(typeid(T));
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码有一个编译错误:没有定义更少的运算符std::type_info所以我专门定义了一些较少的类std::type_info,并将它作为map类的第三个模板参数传递,如下所示:
struct typeinfoless
{
bool operator()(std::type_info& left, std::type_info& right)
{
return left.hash() < right.hash();
}
}
std::map <std::type_info, object*, typeinfoless> mMetaData;
Run Code Online (Sandbox Code Playgroud)
但后来我遇到了另一个错误,我不知道如何解决,std::type_info …
vector<some_struct&> array我的代码中有一个,每当我想在我的向量中添加一些对象时我就会使用它array.push_back(*new some_struct).现在我想知道我是否应该在清除数组之前删除数组中的每个对象(使用delete&array [i])?
AFAIK此代码不是标准的有效c ++代码:
int a = 5;
int b[a];
Run Code Online (Sandbox Code Playgroud)
但似乎很多编译器可以编译该代码(主要是警告),它只是按预期运行.我错了是编译器对我好吗?
好吧,这是我第一次使用lambda,我知道我可能会滥用此功能,但我想知道为什么我会出现编译错误?
GameMap::MoveDirection AIPlayer::getSafeRouteTo(const GameMap::PlayerInfo& s, const Point& e)
{
struct node : public Point
{
GameMap::MoveDirection parent;
float d;
node():Point(){};
node(Point p) : Point(p)
{
};
};
auto lambdaFunction = [this,&e](node&left,node&right)->bool
{
return this->getDistance(left,e) + left.d < this->getDistance(right,e) + right.d;
};
priority_queue<node,vector<node>, decltype(lambdaFunction)> Q;
//do stuff
return GameMap::MD_None;
}
Run Code Online (Sandbox Code Playgroud)
为了便于讨论,我说MoveDirection是一个枚举,并且Point确实具有默认构造函数。正如我通过删除该特定行评论的那样,我没有收到错误,但我确实需要它存在。以下是VC2010产生的错误:
d:\program files (x86)\microsoft visual studio 10.0\vc\include\queue(225): error C2512: '`anonymous-namespace'::<lambda0>' : no appropriate default constructor available
1> d:\program files (x86)\microsoft visual studio 10.0\vc\include\queue(223) : while compiling class template member function 'std::priority_queue<_Ty,_Container,_Pr>::priority_queue(void)' …Run Code Online (Sandbox Code Playgroud) 可能重复:
任何导致全局新增和删除的原因?
在c ++中你可以重载new/delete运算符,这样做有什么好处吗?因为在调用operator之后,new它的结果值被发送到构造函数并且在调用operator之前,就会调用delete析构函数.
它困扰着我delete []实际上做了什么,所以我只是尝试了一些代码,我对结果感到震惊
测试#1:
int main()
{
int *d;
while(true)
{
d = new int[10];
delete []d;
}
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,程序根本不消耗任何内存.
测试#2:
int main()
{
int *d;
while(true)
{
d = new int[10];
delete [](d + 5);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然在每个循环中应该至少有20个字节(对于它保留在数组开头的五个整数)保留但未删除此程序也不消耗任何内存!
测试#3:
int main()
{
int *d;
while(true)
{
d = new int[10];
delete []d;
*d=1;
}
}
Run Code Online (Sandbox Code Playgroud)
这个导致访问违规按预期进行(似乎所有内存都被删除delete []d).
测试#4:
int main()
{
int *d;
while(true)
{
d = new int[10];
delete [](d+5);
*d=1;
}
}
Run Code Online (Sandbox Code Playgroud)
这个是最令人惊讶的,虽然while不消耗任何内存,程序也不会产生任何访问冲突,我只是想知道*d在哪里存储它的数据?
(顺便说一下,所有程序都是使用无优化编译的!) …
当我们编程时,C文件扩展名通常以"C"或"CC"或"H"为基础.然后我们迁移到C++并且引入了新的文件扩展名"cpp"和"hpp"虽然"hpp"不常用(或者至少我认为是这样),那么什么是新的C++ 0x文件扩展名或者它们有何不同来自c/c ++文件?
我知道这个标题有很多问题,但我能找到一个可以帮我决定的问题.我是游戏开发团队的一员,通常每个程序员,游戏设计师和艺术家中有1或2个参与项目.我的主要目的是让团队保持同步(第二件重要的事情就是拥有我们所做的所有事情的历史).由于项目中涉及非程序员,我需要版本控制软件,你建议有一个用户友好的gui,以防止其他人抱怨,并使他们通过版本控制生成shareevery shareevery.在搜索到现在为止我认为我更喜欢使用SVN或GIT,但我想知道哪一个最适合我们的目标,你能提出什么建议吗?(我知道tortuisSVN和tortoisGIT)