我有一个类,在特定情况下,它的某些属性需要引用一个外部变量。我设法做到了,但是还有更好的方法吗?
#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(){
}
};
但是,当使用外部引用时,这会带来一些内存开销,因为
a0
和b0
尽管未使用,但仍在类中使用空间。但是,这种构造很少需要,并且值得以少量的内存消耗imo。但是从设计 Angular 来看,这种构造值得怀疑,因为它可能会造成困惑和危险。假设您添加了
clear()
方法,该方法清除了两个Vector
成员:void clear() {
a->clear();
b->clear();
}
现在,一个同事创建了一个
LineSeg( myVector1, myVector2, false)
,并在进行了一些计算调用之后创建了myLineSeg.clear()
-这可能会很困惑,因为他自己的myVector1
和myVector2
已清除。这就是为什么我将此限制为互斥锁等特殊情况,并且通常只允许使用
protected
。在大多数其他情况下,vu1p3n0x是正确的-最好仅使用一种机制-始终复制,始终拥有所有权或使用
shared_ptr
。