2012-04-08 21 views
0

首先,我一直在尋找我的特定問題,但我還沒有找到任何答案。 所以,我想要做的就是重載<<操作,這樣我可以這樣做:在腦海重載<<運算符來存儲數據

myObj = new MyObj(); 
unsigned int v = 2; 
myObj << v; 

飼養,這將使的是,使用這個類:

class MyObj{ 
private: 
    char *data; 
    int count; 

public: 
    MyObj(){ data = new char[64]; count = 0; } 
    //This "is" the overloaded << method 
    template <typename T> 
    T& operator<<(T val){ 
    *(T*)(data + count) = val; 
    count += sizeof(T); 
    } 
} 

效果應該可以與此相同(suppossing 數據是一個公共屬性):

myObj << v; 

應該是相同

*(unsigned int*)(myObj.data + myObj.count) = v; 
myObj.count += sizeof(v); 

有關如何做到這一點的任何想法?我只找到超載I/O或位操作符的方法,但是像這樣。

謝謝!

+0

好吧,對不起。標題應該是「<<" not ">>」。我也想重載>>,但這不是我打算髮布的內容。 – Guillem 2012-04-08 22:15:30

+0

您應該可以使用標籤下方的鏈接編輯您的問題。無論如何,我不是C++的人,但不是'operator <<',而不是'overload <<'? – Ryan 2012-04-08 22:16:53

+1

它被稱爲運算符<<(T val) – unsym 2012-04-08 22:16:57

回答

1

如果我理解正確的話,你有

MyObj *myObj; 
...... 
myObj = new MyObj(); 
unsigned int v = 2; 
myObj << v; 

爲了能夠使用<<這樣,你通常有:

MyObj myObj; 
...... 
unsigned int v = 2; 
myObj << v; 

或者你可以使用:

myObj = new MyObj(); 
unsigned int v = 2; 
(*myObj) << v; 

如果你想能夠編寫像myObj << u << v這樣的代碼,你還需要:

.... 
    template <typename T> 
    MyObj& operator<<(T val){ 
     *(T*)(data + count) = val; 
     count += sizeof(T); 
     return *this; 
    } 
.... 
+0

雖然我已經解決了它,但我缺少那最後一塊。非常感謝你! – Guillem 2012-04-09 00:04:00

+0

+1但注意'*(T *)(data + count)= val;'只適用於POD類型...並且應該是一個明確的'reinterpret_cast' ...並且這個任務可以更好地通過'std :: num_get'和'std :: num_put'以及每個可序列化類更傳統的'operator <<'重載。 – Potatoswatter 2012-04-09 00:26:54

+0

至於沒有問題的POD,我只是在使用基本類型。我知道我這樣做的方式非常「黑客」,而不是最安全的方式。但考慮到這種情況,它會有所用,我需要它快速不可靠,我會保持原樣。不過,我會看看你的建議,以進一步記錄和未來的項目。謝謝 – Guillem 2012-04-09 02:54:09