我有一个不寻常的情况,C++防止复制的成员数据
说我有类似下面的类,
template <typename T>
class C
{
public :
C (int size) : value_(size), some_other_member_(size) {}
T &value() {return value_;}
const T &value() const {return value_;}
private :
T value_;
SomeOtherType some_other_member_;
};
设计,使得客户端可以完全访问成员value_
类,就像std::vector
的operator[]
会返回一个引用,这个类也是必须通过返回一个引用给客户端完全访问。一个二传手/吸气器对不会。
但是,与std::vector
不同,我不想让客户端能够完全替换成员。也就是说,客户端应能够调用const
或非的value_
const
成员,但以下不得,
C<SomeType> c(10);
SomeType another_value(5);
c.value() = another_value; // This shall not be allowed
是否有任何可能的方式,我可以给客户全面进入value_
。在某种意义上,类C
应该像一个容器,但是一旦它包含的东西被初始化(通过构造函数,需要到T
,但在这里不相关),客户端只能通过T
的成员修改value_
的成员职能,而不是用作业取代value_
。
但是,要求T
是不可复制的不是我的选择。因为可以复制类C
。问题的核心是,如类C
,C
有几个成员,它们都具有size
属性,当它们被构建时,它们都被构造为具有相同的size
,如果value_
被允许通过赋值被替换,那么它允许数据结构被腐蚀,因为成员可能不再具有相同的size
属性。
要求T
只允许在大小相同时进行复制或分配也不是一种选择。因为,当复制一个C
对象时,源和目标之间的大小可能不同。例如,
C c1(10);
C c2(20);
c1 = c2;
是完全合理的。 c1
的大小已更改,但其所有成员也都更改为相同的新大小,因此它是可以的。
我希望我已经说清楚了这个问题。我总结,我想要C
不会对T
构成太大的限制,T
基本上可以是任何带有必需构造函数的类型。可以复制并分配T
。我不希望客户做的唯一的细点是value_
到C::value()
。
如果您为该值提供非常量引用,则可以对其进行修改。所以不要提供。一个const引用就足以读取该值。 –