我有一個不尋常的情況,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引用就足以讀取該值。 –