gpt4 book ai didi

c++ - 仅在某些情况下具有引用外部变量的属性的类

转载 作者:行者123 更新时间:2023-11-30 05:05:33 24 4
gpt4 key购买 nike

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

#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 仍然使用类中的空间,尽管没有使用。然而,这样的构造很少是必需的,而且在我看来,它的小内存成本是值得的。

但从设计角度来看,这种构造是有问题的,因为它可能会造成混淆和危险。假设您添加了一个方法 clear(),它清除了两个 Vector 成员:

void clear() {
a->clear();
b->clear();
}

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

这就是为什么我将它限制在像互斥体这样的特殊情况下,并且通常只允许它protected

在大多数其他情况下,vu1p3n0x 是正确的 - 只使用一种机制要好得多 - 始终复制、始终获取所有权或使用 shared_ptr

关于c++ - 仅在某些情况下具有引用外部变量的属性的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48275172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com