1
看看下面的代碼:只讀類變量(C++)和運算符重載
#include <string>
#include <iostream>
template <class T, class U>
class readonly
{
friend U;
private:
T data;
T operator=(const T& arg) {data = arg; return data;}
T operator+=(const T& arg) {data = data + arg; return data;}
T operator-=(const T& arg) {data = data - arg; return data;}
T operator*=(const T& arg) {data = data * arg; return data;}
T operator/=(const T& arg) {data = data/arg; return data;}
public:
operator const T&() const {return data;}
};
class myClass
{
private:
typedef readonly<int, myClass> RO_int;
typedef readonly<std::string, myClass> RO_string;
public:
RO_int x;
RO_string y;
void f()
{
x = 55;
y = "Howdy";
std::cout << x << "\n\n"; // compiles fine
std::cout << y << "\n\n"; // compile error
}
};
我使用這些模板類,以確保某些公共變量x
和y
是「只讀」的外該類,但可以在類本身內進行修改。除了最後一行,我試圖顯示字符串類型的變量y,這段代碼中的所有東西都編譯得很好。我不明白爲什麼我能夠顯示x
而不是y
。如果我需要超載<<
運營商,爲什麼我必須爲std::string
而不是int
?
這只是一個包含在main.cpp中的頭文件。我在main.cpp中做的所有事情是創建一個myClass類型的對象,然後調用函數f()。對不起,我應該更清楚一點。 – JohnTravolski
int的輸出是0,所以我不認爲它使用正確的超載來顯示'x'。可能你需要重載'<<'使其適用於任何類型。 –
似乎很直接的一些機制:'private:int x_; public:int x()const {return x_; }'。 –