2012-04-25 87 views
-1

我正在使用boost::ptr_vector,但我相信这也适用于标准std::vector以及。我试图把对象的指针polymophically成boost::ptr_vector层次是,我有一个EntityObject继承被用线创建指针的多态性

Object * newObject = new Entity(param1, param2); // then I attempt to add it to the ptr_vector 

,但如果我打破程序(Visual Studio 2010中)看这个指针永远不会被垃圾重定向,垃圾也会被保留。我单步执行代码,并进入参数化构造函数,并遵循正确的逻辑步骤。

我不确定发生了什么问题。是否需要在父项或子项中具有特定的成员函数才能使此多态行为起作用(当前,所有子项都具有对其类型唯一的参数化构造函数,以及具有多态交互方法的析构函数)。我必须拥有赋值操作符,还是我应该在Object类中拥有构造函数。

这似乎是呼吁运营商new不解决对象,但解决其他问题,但VS2010不会引发错误。


编辑:说明应该发生什么。

通过2D std::vector(矩形/非锯齿)使用case/switch来确定对象

要产生,并添加创建构建

指针到对象,并分配给新//我步进认为这是哪里的问题是发生

然后该指针的基准在Visual梭哈被推到一个管理器部件boost::ptr_vector

io 2010我在线上创建了一个中断来创建指针,并分配新的(多态),并且在push_back()boost::ptr_vector之间的线上注视着指针。 temp指针的值被创建,并且进入构造函数,它遵循构造函数的所有逻辑步骤,当构造函数完成时,并且栈返回到调用构造函数的那一行,指针仍然是相同的值(我认为这是可接受的),但是当我查看它指向的所有值显示为问号(包括静态组成的对象)的对象时。那么当回推触发,并进入升压头时,x值显示相同的信息。

它几乎看起来像指针正在创建,并且该对象的数据都被创建,但是一旦构造函数完成,它实际上不会将值分配给父类对象,这应该相当简单polyphophic行为。

例如关注的标题(真正的头确实有成员变量,它们的实现是在一个单独的cpp文件):

class Object{ 
public : 
    virtual void interact(int action, Object& source){} 
    virtual void updateObject(float duration){} 
    virtual ~Object(){} 
    bool operator==(const Object& _other)const; 
    bool operator!=(const Object& _other)const; 
}; 

class Entity : public Object{ 
public: 
    Entity(Vector3 location, Type thisType, SpecialType difficulty=noSpecial); 
    ~Entity(); 
    void interact(int action, Object& source); 
    void updateObject(float duration); 
}; 

编辑:手头不断变化的环境,以更好的目标问题,收到一个解决方案

+0

你能告诉我们你是如何填充向量吗? – Naveen 2012-04-25 16:41:58

+0

@naveen我不认为它有什么关系填充矢量,但实际上获取正在构建的对象,并首先分配给指针 – gardian06 2012-04-25 17:55:01

+3

这可能是一个愚蠢的问题,但以防万一......您正在调试非优化的调试版本,对吗?因为在发布版本中,编译器很可能会跳过所有中间副本,并将指针留在某个寄存器中,而不是将其存储在内存中的任何位置,直到该向量的存储为止。调试器_could_通过显示该寄存器的内容来处理该事件,无论何时您尝试查看newObject,x等,但它可以通过显示这些指针的垃圾或拒绝显示任何内容来轻松处理它。 – abarnert 2012-04-27 22:18:38

回答

0

根据你发布的内容,很难(如果可能的话)确定问题,更不用说它是如何发生的它。

也许最好从实际工作的东西开始,并添加所需的功能,或者至少弄清楚你偏离期望/有效的地方。因此,下面是一个动态创建对象的小示例,将它们放入一个ptr_vector,在每个对象中使用一个虚函数来验证容器中的内容是预期的,然后让容器超出范围(并且在此过程中销毁它包含的指针引用的对象)。

#include "boost/ptr_container/ptr_vector.hpp" 
#include <iostream> 
#include <string> 
#include <sstream> 

class Object { 
    std::string name; 
public: 
    Object(std::string const &n) : name(n) {} 

    virtual std::ostream &write(std::ostream &os) const { 
     return os << name; 
    } 

    virtual ~Object() { std::cout << "Object being destroyed\n"; } 
}; 

class Entity : public Object { 
    int value; 
public: 
    Entity(int v, std::string name) : Object(name), value(v) {} 

    std::ostream &write(std::ostream &os) const { 
     return os << "Entity: " << value; 
    } 
    ~Entity() { std::cout << "Entity being destroyed\n"; } 
}; 

int main() { 
    boost::ptr_vector<Object> objects; 

    for (int i=0; i<10; i++) { 
     std::stringstream name; 
     name << "object: " << i; 
     if (i & 1) 
      objects.push_back(new Object(name.str())); 
     else 
      objects.push_back(new Entity(i, name.str())); 
    } 

    boost::ptr_vector<Object>::iterator pos; 
    for (pos = objects.begin(); pos != objects.end(); pos++) { 
     pos->write(std::cout); 
     std::cout << "\n"; 
    } 
    return 0; 
} 

至少对我来说,输出看起来是这样的:

Entity: 0 
object: 1 
Entity: 2 
object: 3 
Entity: 4 
object: 5 
Entity: 6 
object: 7 
Entity: 8 
object: 9 
Entity being destroyed 
Object being destroyed 
Object being destroyed 
Entity being destroyed 
Object being destroyed 
Object being destroyed 
Entity being destroyed 
Object being destroyed 
Object being destroyed 
Entity being destroyed 
Object being destroyed 
Object being destroyed 
Entity being destroyed 
Object being destroyed 
Object being destroyed 

对于它的价值,请注意析构函数 - 当一个Object被破坏,只有基析构函数被调用,但是当一个Entity被破坏,首先调用派生的dtor,然后调用基础dtor(所以我们看到'实体被破坏'和'物体被破坏')。

+0

我正在通过'boost :: prt_vector '调用'ptr_vector'来错误地处理它,这使得它们总是等于最后放置的东西,当该指针超出范围时,对象停止存在,因此垃圾。 – gardian06 2012-05-05 01:17:45

1

该指针值只改变构造函数完成后,这不是问题。这是合乎逻辑的,因为首先临时指针被执行并且只有它被分配给你的指针。

+0

但重新分配不会发生,就像构造函数被调用,然后赋值没有发生 – gardian06 2012-04-25 17:56:07

1

Object * newObject = new Entity(param1, param2); 

后,你将有newObject指向新创建的对象。虽然构造函数是 正在运行,但仍未分配newObject。如果你之后有例如

vec.push_back(newObject); 

可以踏入push_back方法并查看参数是具有 一个虚拟表引用到Entity方法的一个Object。 (你至少有一个虚拟的析构函数, 对吧?)

+0

是的我有一个虚拟析构函数,当我输入'push_back()'时,'x'显示相同的垃圾指针值,当我查看指针指向的值时,即使我的'Entity'构造函数赋值,它也显示出问号,而'new'应该创建一个指针,并将它分配给指针变量吧? – gardian06 2012-04-25 18:54:43