在类中声明成员时,指针是否比实例更好?

时间:2010-10-25 03:35:49

标签: c++ pointers object vector

选项1:

class B{//};
class A
{
    public:
        void Funcs();
    private:
       std::vector<A> vecA;
};

选项2:

class B{//};
class A
{
    public:
        void Funcs();
    private:
        std::vector<A*> vecpA;
};

哪一个更好,有没有指导方针?

3 个答案:

答案 0 :(得分:3)

这是取决于具体方案的事情之一。以下是在决定这些不同选项时要问自己的问题的不完整清单:

  1. 是多态的吗?即,您是否知道编译时的确切类型,或者您是否可以使用从相同基类型继承的不同运行时类型。多晶型=&gt;指针。
  2. 这个物体有多大?即,构建堆栈上的对象会超出我的堆栈分配吗?如果它从小到中等大,那就没关系了。巨大=&gt;指针。
  3. 我是否要确保只有我的副本(或我的副本是唯一的)。此对象是否会暴露给界面的其他部分。这是否会导致API的所有权模糊不清。如果是,那么可能指针不是最佳选择。这对于直接使用对象来说是个好例子。整体API清洁度=&gt;对象。
  4. 如果你选择了指针,通常你会想要使用boost :: unique_ptr(如果类是唯一的所有者),或者如果数据可以在多个对象,线程等之间共享则使用boost :: shared_ptr。罕见的情况是原始的,常规的C ++指针正确的方法。很难确定那些是什么。

答案 1 :(得分:0)

尽可能使用对象矢量。当这是完成你想要的唯一(合理)方式时,使用指针向量。除此之外,您还必须处理A 是否拥有 vecA中的对象或仅引用其他对象所拥有的对象等问题。

答案 2 :(得分:0)

如果'A'不可复制和可分配,你别无选择,只能使用指针'A'。如果'A'不可复制和可分配,你别无选择,只能使用指针到'A'。

假设“A”是可复制和可分配的,那么选择将受到以下因素的指导,包括但不限于:

a)你真的希望容器/算法在一个单独的副本而不是原始对象(通过指针)上运行

b)复制的性能损失是什么?

c)您是否希望使用指针方法在容器中存储多态对象?

我想在C ++ 0x的RValue引用在(a)和(b)点提供了一些缓解,但我不确定。