具有仅在某些情况下引用外部变量的属性的类
Class with attributes referencing an external variable only in some cases
我有一个类,在特定情况下,它的某些属性需要引用外部变量。我设法以这种方式做到了,但是有更好的方法吗?
#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。
但从设计上讲,这种结构是值得怀疑的,因为它可能会令人困惑和危险。假设您添加一个方法clear()
,这将清除两个Vector
成员:
void clear() {
a->clear();
b->clear();
}
现在,一位同事创建了一个LineSeg( myVector1, myVector2, false)
,经过一些计算调用后myLineSeg.clear()
- 这可能非常令人困惑,因为他自己的myVector1
和myVector2
都被清除了。
这就是为什么我将其限制在互斥体等特殊情况下,并且通常只允许它protected
。
我大多数其他情况 vu1p3n0x 是正确的 - 只使用一种机制要好得多 - 要么始终复制,始终获得所有权,要么使用shared_ptr
.
相关文章:
- 在类函数中初始化外部作用域变量
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 同时具有"外部"和"内联"说明符的变量
- 访问 PlatformIO 中的外部环境变量
- 如何在函数外部访问函数中局部变量的值?
- 堆栈/帧指针作为外部变量
- 使用外部文件中的变量进行视觉C++
- 内联函数/变量的外部链接
- 当使用lambda进行变量的复杂初始化时,如何处理从内部抛出的lambda外部异常
- const_cast const 方法中的"this"将"this"分配给外部变量?
- 全局外部指针变量在 DLL 中不可见
- 在没有外部文件的情况下在应用会话之间保存变量
- 外部变量的初始化
- 全局变量的循环依赖性与外部说明符
- 如何在命名空间中初始化外部变量
- 声明类指针变量外部班级
- 在 VC++ 中访问一个文件中声明的变量.(外部关键字用法)
- 为什么 cout 不打印变量"C"外部?
- 全局变量外部声明后的线程专用指令
- c++变量外部声明