我有一个类,在特定情况下,它的某些属性需要引用一个外部变量。我设法做到了,但是还有更好的方法吗?

#include "Vector.h"

class LineSeg
{
private:
    Vector* a;
    Vector* b;
    bool owns;
public:
    LineSeg(){
        a = new Vector();
        b = new Vector();
        owns = true;
    }
    LineSeg(Vector ap, Vector bp){
        a = new Vector(ap);
        b = new Vector(bp);
        owns = true;
    }
    LineSeg(Vector &ap, Vector &bp, bool owns){
        a = ≈
        b = &bp;
        owns = false;
    }
    virtual ~LineSeg(){
        if(owns){
            delete a;
            delete b;
        }
    }
};

我不能上两个不同的课。

最佳答案

在执行此类操作时(偶尔发生,尤其是对于互斥锁),我通常使用指向成员的指针。这避免了析构函数中的任何特殊处理和delete

#include "Vector.h"

class LineSeg
{
private:
    Vector a0;
    Vector b0;
    Vector* a = &a0;
    Vector* b = &b0;
public:
    LineSeg()
    {
    }
    LineSeg(Vector &ap, Vector &bp, bool copy) {
        if( copy )
        {
            a0 = ap;
            b0 = bp;
            return;
        }
        a = ≈
        b = &bp;
    }
    virtual ~LineSeg(){
    }
};

但是,当使用外部引用时,这会带来一些内存开销,因为a0b0尽管未使用,但仍在类中使用空间。但是,这种构造很少需要,并且值得以少量的内存消耗imo。

但是从设计 Angular 来看,这种构造值得怀疑,因为它可能会造成困惑和危险。假设您添加了clear()方法,该方法清除了两个Vector成员:
void clear() {
    a->clear();
    b->clear();
}

现在,一个同事创建了一个LineSeg( myVector1, myVector2, false),并在进行了一些计算调用之后创建了myLineSeg.clear()-这可能会很困惑,因为他自己的myVector1myVector2已清除。

这就是为什么我将此限制为互斥锁等特殊情况,并且通常只允许使用protected

在大多数其他情况下,vu1p3n0x是正确的-最好仅使用一种机制-始终复制,始终拥有所有权或使用shared_ptr

09-04 16:12
查看更多