Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.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++_Constructor_Polymorphism - Fatal编程技术网

C++ 指针的多重性

C++ 指针的多重性,c++,constructor,polymorphism,C++,Constructor,Polymorphism,我使用的是boost::ptr_向量,但我相信这也适用于标准std::向量。我试图将指向对象的指针多层次地放入boost::ptr_向量层次结构是,我有一个实体,它继承了使用该行创建的对象 Object * newObject = new Entity(param1, param2); // then I attempt to add it to the ptr_vector 但是,如果我中断程序(VisualStudio2010)来查看所持有的内容,指针永远不会从垃圾中重定向,垃圾也会被持

我使用的是
boost::ptr_向量
,但我相信这也适用于标准
std::向量
。我试图将指向对象的指针多层次地放入
boost::ptr_向量
层次结构是,我有一个
实体
,它继承了使用该行创建的
对象

Object * newObject = new Entity(param1, param2);  // then I attempt to add it to the ptr_vector
但是,如果我中断程序(VisualStudio2010)来查看所持有的内容,指针永远不会从垃圾中重定向,垃圾也会被持有。我一步一步地完成了代码,它确实进入了参数化构造函数,并遵循了正确的逻辑步骤

我不确定出了什么问题。我是否需要在父级或子级中具有特定的成员函数才能使此多态行为正常工作(当前所有子级都具有其类型特有的参数化构造函数、析构函数以及多态交互方法)。我必须有赋值运算符,还是应该在
对象
类中有构造函数

似乎对操作符
new
的调用并没有解析为对象,而是解析为其他对象,但VS2010没有抛出错误


编辑:解释应该发生的事情

在2D
std::vector中单步执行(矩形/非锯齿形)

使用
case/switch
确定要生成的对象,并将其添加到结构中

创建指向对象的指针,并将其分配给new//我认为这就是问题所在

然后将该指针的引用推送到管理器成员
boost::ptr_vector

在VisualStudio2010中,我在创建指针的行上放置了一个分隔符,并在
push_back()
的行上为观察指针的
boost::ptr_向量指定了一个新的(多态的)。创建temp指针值,进入构造函数时,它遵循该构造函数的所有逻辑步骤,当构造函数完成,堆栈返回到调用构造函数的行时,指针仍然是相同的值(我认为这是可以接受的),但当我查看它指向的对象时,所有值都显示为问号(包括静态组合的成员对象)。然后,当按下按钮触发并进入boost header时,
x
值显示相同的信息

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

关注的示例头(实际头确实有成员变量,它们的实现在单独的cpp文件中):



编辑:更改上下文以更好地针对手头的问题,并接收解决方案。指针值仅在构造函数完成后更改,这不是问题。这是合乎逻辑的,因为首先操作一个临时指针,然后只将它分配给指针。

之后

Object * newObject = new Entity(param1, param2);
您将使
newObject
指向新创建的对象。而构造函数是 运行时,
newObject
仍未分配。如果你以后有

vec.push_back(newObject);
您可以进入
push_back
方法,看到参数是一个
对象
引用
实体
方法的虚拟表。(您至少有一个虚拟析构函数,
是吗?

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

也许最好从实际可行的东西开始,添加您需要的功能,或者至少了解您偏离预期/可行的地方。因此,这里有一个动态创建对象的小示例,将它们放入
ptr_向量
,在每个向量中使用一个虚拟函数来验证容器中的内容是否符合预期,然后让容器超出范围(在此过程中,销毁它包含的指针所引用的对象)


值得一提的是,注意析构函数——当
对象
被销毁时,只调用基本dtor,但当
实体
被销毁时,首先调用派生dtor,然后调用基本dtor(因此我们看到“实体被销毁”和“对象被销毁”).

你能告诉我们你是如何填充向量的吗?@naveen我认为这与填充向量无关,但与实际获取正在构造的对象并首先分配给指针有关这可能是一个愚蠢的问题,但以防万一……你正在调试未优化的调试构建,对吗?因为在在构建之前,编译器很可能会跳过所有中间副本,只将指针留在某个寄存器中,而在向量存储之前不将其存储在内存中的任何位置。调试器可以通过在您尝试查看newObject、x等时显示该寄存器的内容来处理此问题,但也可以很容易地手动执行通过显示这些指针的垃圾,或者拒绝显示任何内容来实现。还有一件事:如果您fprintf/syslogs/cerr/which newObject和/或newObject->someMember(如果它们都是私有的,则暂时为测试公开一个)会发生什么在新的和推回之间?你能创建一个简短的、可编译的示例程序来展示这种行为吗?只要观察到相同的行为,它就不必与你使用的实际类在一起。到目前为止,你所描述的不应该发生,所以用实际代码进行实验是有益的,但重新分配s没有发生它就像调用了构造函数,然后分配没有发生我有一个虚拟析构函数,当我输入
push_back()
时,
x
显示
vec.push_back(newObject);
#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