小编Ali*_*232的帖子

如何创建一个容器,每个对象一个?

我试图为可以附加到我的对象的可能元数据创建一个容器.我可以保证每类最多只有一个对象附加到我的班级,但是对于不同类型的对象没有限制.例如,我不能将两个实例附加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 …

c++ stl generic-programming typeid typeinfo

2
推荐指数
1
解决办法
1136
查看次数

这是c ++中有效的删除操作吗?

vector<some_struct&> array我的代码中有一个,每当我想在我的向量中添加一些对象时我就会使用它array.push_back(*new some_struct).现在我想知道我是否应该在清除数组之前删除数组中的每个对象(使用delete&array [i])?

c++ pointers reference

2
推荐指数
1
解决办法
157
查看次数

在c ++中创建一个非常长的数组时会发生什么?

AFAIK此代码不是标准的有效c ++代码:

int a = 5;
int b[a];
Run Code Online (Sandbox Code Playgroud)

但似乎很多编译器可以编译该代码(主要是警告),它只是按预期运行.我错了是编译器对我好吗?

c++ arrays

2
推荐指数
1
解决办法
170
查看次数

C ++ Lambda错误:没有合适的默认构造函数

好吧,这是我第一次使用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++ lambda visual-c++ c++11

2
推荐指数
1
解决办法
880
查看次数

为什么我会重载operator new或operator delete?

可能重复:
任何导致全局新增和删除的原因?

在c ++中你可以重载new/delete运算符,这样做有什么好处吗?因为在调用operator之后,new它的结果值被发送到构造函数并且在调用operator之前,就会调用delete析构函数.

c++ memory-management new-operator

1
推荐指数
1
解决办法
460
查看次数

为什么这个程序不消耗内存?

它困扰着我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++ arrays delete-operator

1
推荐指数
1
解决办法
209
查看次数

什么是c ++ 0x源文件的默认文件扩展名?

当我们编程时,C文件扩展名通常以"C"或"CC"或"H"为基础.然后我们迁移到C++并且引入了新的文件扩展名"cpp"和"hpp"虽然"hpp"不常用(或者至少我认为是这样),那么什么是新的C++ 0x文件扩展名或者它们有何不同来自c/c ++文件?

c++ file-extension c++11

1
推荐指数
1
解决办法
1180
查看次数

哪个版本控件最适合我?

我知道这个标题有很多问题,但我能找到一个可以帮我决定的问题.我是游戏开发团队的一员,通常每个程序员,游戏设计师和艺术家中有1或2个参与项目.我的主要目的是让团队保持同步(第二件重要的事情就是拥有我们所做的所有事情的历史).由于项目中涉及非程序员,我需要版本控制软件,你建议有一个用户友好的gui,以防止其他人抱怨,并使他们通过版本控制生成shareevery shareevery.在搜索到现在为止我认为我更喜欢使用SVN或GIT,但我想知道哪一个最适合我们的目标,你能提出什么建议吗?(我知道tortuisSVN和tortoisGIT)

svn git version-control

0
推荐指数
1
解决办法
276
查看次数