Re: [問題] 關於operator
※ 引述《tyc5116 (累人啊....)》之銘言:
: ※ 引述《holymars ()》之銘言:
: 有幾個地方還是不懂
: : 如果你要直接在這裡把list寫出去 就不需要我上面四個函數中的後兩個了
: : ostream& a::operator<<(ostream& out,aaa& v);
: : 這個的目的是對Type aaa重載 <<運算子
: : 如果你有重載operator<<
: 不是很懂這句話的意思....@@
: 我自己的想法是,aaa物件內含許多a物件,而我們主要是把所有a物件的屬性紀錄下來
: 所以就上面的for迴圈這樣寫
考慮以下情況:
1.如果aaa裡面除了a物件之外 還有一堆member 這些member也該被輸出
2.如果我有個class叫bbb,裡面內含aaa,我想要一次輸出很多個aaa的時侯
1.的情況也許好解決 只要把那些member的輸出也寫進LoadContent就好了
2.的情況就很麻煩了 依你的架構我只能把每個aaa都獨立對ostream輸出
為了保留程式的彈性和擴充性
重載operator<<,再讓LoadContent去呼叫它是比較好的作法
當然這不是個語言上的錯誤 而是設計上的..
: : 這三行for迴圈就能改寫成一行 outfile << *this;
: : 注意這兩個函式是要宣告在class a(或vTPData)的friend,而不是aaa的friend
: 我的確是把friend ostream& operator<<(ostream& out,a& va)這一個
: 放在class aaa內,不過你說這樣是錯的,可是可以正確的紀錄吶,好奇怪...@@
因為你確實在aaa的scope裡宣告了一個函式operator <<
所以你在aaa::LoadContet()裡寫下 out << a; 的時侯
編譯器知道你要呼叫的是operator<<(ostream& out, a& va)這個函式
語言並沒有規定你一定要把運算子重載函式寫在其相關的class裡面
我甚至可以在Ctype裡面定義Btype的加法
class Btype;
class Ctype {
Btype operator+(Btype& lhs, Btype&rhs);
}
這是合法的,但是卻充滿設計上的不合理性
: 因為我想說放在aaa裡面,藉由迴圈,再藉由a內的GetID()去讀取屬性,這樣就好了
另外你似乎沒有弄懂friend關鍵字的含義
如果你在寫出a的時侯
只打算要使用a的public interface,那沒有必要把該函式宣告為friend
friend修飾函式的意思是「允許此函式存取class的private interface」
: 只是苦於list內還有一個vector,不知道怎麼紀錄,這才是我主要的問題點
最正確的設計是在class a裡
宣告operator<<為friend讓它有對a的pirvate成員(vector變數)的存取權
: : 因為你的目的是要存取a(或vTPData)的private
: : 兩種方法
: : 1.像上面處理list一樣,用一個迴圈輸出vector內所有的元素
: : 2.overload std::vector<>的operator <<
: : 注意,C++標準不允許你改變/添加namespace std裡的東西
: : 所以你重載的函式要放在自己的namespace或global namespace
: 不是很懂這句話的意思...也許等前面的問題搞懂了再來測試一下這個部份....@@
這句話的意思是:不要更動namespace std內的任何東西
如果你要動,請在自己的namespace裡做
: : 你原本關於a的那兩個(前兩個)宣告錯位置了
: : 關於aaa的那兩個(後兩個) 前面有說明
: : 如果你打算在LoadContent裡面處理 就不用重載 aaa的 operator <<
: : 在你的IDE(VC, DevC, etc..)的include資料夾設定裡面加入含有boost資料夾的那個目錄
: : 不用把整個boost的include檔都copy到專案裡..
: : 指定位置讓compiler自己去找就好
: : 注意要指定搜尋的是boost的父目錄 而不是boost這個目錄
: : #include <boost/xxxxxxxx.h>像這樣使用
: 指令我沒打錯(因為sample有寫)只是在連結的部份似乎有問題
: 我有google了一下(我用vc++),在專案,屬性,c/c++,一般,其它Include目錄
: 設定該目錄(C:\boost_1_40_0\boost),compile後.....
: error C3389: __declspec(dllexport) 不能配合 /clr:pure 或 /clr:safe 使用
: 很傻眼....@@
你要把code編譯成MSIL支援(類似java bytecode那樣的東西)
那當然是不能使用外部的dll library的(這是機器碼)
簡單的說 你指定你的程式「不要編譯成機器碼」但是你給它一個機器碼的library
這怎麼可能會link的起來呢..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.15.163
※ 編輯: holymars 來自: 114.32.15.163 (09/15 17:06)
推
09/16 08:52, , 1F
09/16 08:52, 1F
→
09/16 08:53, , 2F
09/16 08:53, 2F
→
09/16 11:17, , 3F
09/16 11:17, 3F
→
09/16 11:17, , 4F
09/16 11:17, 4F
→
09/16 11:18, , 5F
09/16 11:18, 5F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章