2014-01-23 134 views
2

我有一类设置类似于此:矢量参考对象?

class BlimpBase{ 
public: 
    virtual ~BlimpBase(); 

private: 
    virtual void lift()const = 0; 
}; 

class Blimp: protected BlimpBase{ 
    void lift()const; 
}; 

class BlimpCarrier{ 
public: 
    add_blimp(BlimpBase& blimp); 

private: 
    std::vector<BlimpBase* blimp> blimps; 
}; 

正如你所看到的,我有一组多态飞艇类的,我想,然后存储通过使用指针在矢量“引用”(我意识到你不能在向量中存储引用,我只是不知道如何描述它们)。问题在于大多数这些对象都是作为类成员分配在堆栈上的,但我想将它们添加到这个向量中,以便我可以直接修改它们(副本不会)。保持指向这些对象的问题是,如果这些对象在BlimpCarrier之前超出范围(因为它们在堆栈中),我将会有一个悬挂指针。我看着std::unique_ptrstd::shared_ptr,但我认为我不认为我可以在这里使用它们......

+0

只是不要在堆栈上分配它们。 –

+0

@PaulGriffiths:他们是类的成员,我想通过这个数组“引用”他们。我不认为把它们放在堆上会帮助我解决任何问题 – Shokwav

+0

如果你将它们作为shared_ptr放到类中,并通过shared_ptr或weak_ptr将它们引用到你的矢量中,它会对你有所帮助。 –

回答

0

假设你可以改变它们在堆栈中的分配位置或者它们作为成员的类,那么你可以尝试这跟的std :: weak_ptr的:

class BlimpCarrier{ 
public: 
    add_blimp(std::shared_ptr<BlimpBase>& blimp_ptr) 
    { 
     blimps.push_back(blimp_ptr); 
    } 

private: 
    std::vector<std::weak_ptr<BlimpBase>> blimps; 
}; 

BlimpCarrier globalCarrier; 

void foo() 
{ 
    std::shared_ptr<BlimpBase> instance(new BlimpSubClass()); 
    globalCarrier.add_blimp(instance); 
} 

你需要一个额外的步骤,当你穿越你检查weak_ptr对象已经“过期”或没有,然后自己从载体中删除的载体。我实际上建议使用std::list而不是这种类型的链接列表实现。有关如何正确安全地使用weak_ptr的示例,请参见cppreference.com

+1

对于额外的步骤,使用'std :: remove_if'和'.erase'。 – Griwes