2010-09-27 57 views
0

我需要在C++中存储对派生类实例的引用。我考虑使用shared_ptrs向量到基类(因为它需要持有不同类型的派生类),但是,重要的是容器包含原始指针,而vector(或其他stl容器)则不是这种情况,如果我没错的话。有没有一种方法可以在本地C++中执行此操作,还是必须使用像Boost的ptr_vector这样的特殊容器?C++:原始指针的容器

编辑:这是我的测试代码:

class Foo 
{ 
public: 
    Foo() {} 
    virtual ~Foo() {} 
    virtual void set_x(int i) = 0; 
}; 

class Bar : public Foo 
{ 
public: 
    Bar() {} 

    void set_x(int i) 
    { 
     this->x = i; 
    } 

    int x; 
}; 

int main() 
{ 
    Bar bar; 

    // ptr 
    std::cout << &bar << "\n"; 

    std::vector<Foo*> foos; 
    foos.push_back(&bar); 

    // different ptr value 
    std::cout << &foos[0] << "\n"; 

    foos[0]->set_x(1); 

    // however, changes are made 
    std::cout << bar.x; 

    return 0; 
} 

由于提前,

耶拿

+0

会向量(指向您的对象的指针矢量)不适合你吗? – JoshD 2010-09-27 03:10:43

+0

我不清楚为什么一个'shared_ptr'容器不适合你。 – 2010-09-27 03:13:25

+0

我尝试过,但是当我通过vector.push_back(&instance)添加实例的指针时,向量中的指针与原始指针不同。 – jena 2010-09-27 03:14:13

回答

1

在上例中,您打印的是指针的地址而不是指针的值。

相反的:

// different ptr value 
std::cout << &foos[0] << "\n"; 

// different ptr value 
std::cout << foos[0] << "\n"; 

除此之外您vector<Foo*>会工作得很好。

+0

这是令人沮丧的...当然你是对的。谢谢你指出,我应该考虑一些睡眠。感谢所有人的帮助 - 我对这种虚假抱歉。 – jena 2010-09-27 03:43:29

+0

我很高兴能帮上忙。如果这是一个很好的解决方案,您能否将其标记为公认的答案? – JoshD 2010-09-27 03:45:43

0

如果使用shared_ptr为您的容器部件,在各成员国仍可以访问指针原始对象实例。您可以在集装箱清理后的任何时间获得shared_ptr的副本,但原始对象仍然是其目标。

对于您可以使用boost::ptr_vector一个简单的解决方案,没有提供您的指针在容器中发生两次 - 这情景将引入棘手资源管理的复杂性,并指出你回shared_ptr

+0

shared_ptr对堆中没有分配的类型有意义吗? – jena 2010-09-27 03:27:19

+0

没有。在这种情况下,当变量超出范围时,你的'shared_ptr'将指向堆栈上的垃圾,甚至在栈帧展开后甚至可能无法访问内存。 – 2010-09-27 03:29:15

1

您可以创建一个std :: vector < foo *>,它将保存您交给foo的任何指针。它不会作任何试图删除销毁这些指针,这可能会或可能不是你想要的是,但它会保持与您在传递的价值观。

您还可以创建一个std ::矢量< shared_ptr < foo>>,它将保存指针,这些指针在没有悬挂的shared_ptr的悬挂副本时将被释放。那些也将持有你通过的“原创”foo *你可以通过使用shared_ptr :: get()方法来获得它。

唯一不会看到与派生对象完全相同的指针的是,如果您使用多个类的继承,并且您的基类包含数据。因为foo *最终会在这种情况下指向数据的“foo”部分,而这部分数据不一定位于对象的“根”处。

+0

我不使用多重继承,但基类包含数据。这可能是向量中元素与原始元素有不同指针的原因吗? – jena 2010-09-27 03:32:23

+0

第一次没有看到你的例子;另一个答案已经碰到了你的问题,那就是你得到了VECTOR数据的地址,而不是指针本身。睡眠是发展的重要组成部分。 :) – SomeCallMeTim 2010-09-27 04:18:02