伊莉討論區

標題: [已解決]operator和冒號(:)的使用問題 [打印本頁]

作者: opchta    時間: 2017-7-10 12:26 AM     標題: [已解決]operator和冒號(:)的使用問題

本帖最後由 opchta 於 2017-7-16 11:07 AM 編輯

各位大大好

小弟最近在讀別人的程式,其中有兩個語法沒看過,也爬不太到它們的意思,所以想請問各位大大:

1.有關operator的用法:

以下是它的片斷程式碼

class WrapFile

{

      typedef FILE* ptr;

      ptrwrap_file;

public:

      WrapFile(const char* filename, const char* flag):

            wrap_file(fopen(filename, flag))

      {}

      operator ptr() const {

            return wrap_file;

      }

      ~WrapFile()

      {

            if(wrap_file)

            {

                 fclose(wrap_file);

            }

      }

};

其中的

operator ptr() const {

            return wrap_file;

      }

是什麼意思呢?這個不像operator的運算子重載,我也google不到這個用法的意義。


2.冒號及operator的另一個用法的問題

以下是程式的片斷程式碼:

struct trie_combine_t:public trie_iter_t

{

      trie_combine_t(ptrie_t pt,WordMaker* maker):ptrie(pt)

                                                         ,pmaker(maker)

                                                         ,word_len(0)

      {}

      void operator()(trie_result_t& res)

      {

            char suffix[256];

            ptrie->suffix(suffix, res.length, res.id);

            pmaker->trie.update(suffix, res.length, res.value);

            string s(suffix);

            strrev_unicode(s);

            pmaker->trie_r.update(s.c_str(), res.length, res.value);

            word_len++;

      }

      size_t word_len;

      ptrie_t ptrie;

      WordMaker* pmaker;

};

我知道

trie_combine_t(ptrie_t pt,WordMaker* maker):ptrie(pt)

                                                         ,pmaker(maker)

                                                         ,word_len(0)

{}

冒號後的那些是賦予初始值的意思,但

struct trie_combine_t:public trie_iter_t

的意思我就不知道了,是繼承的意思嗎??

還有,其中

void operator()(trie_result_t& res)

{

      ......

}

是什麼意思啊?

這是它的原始碼(它是github上的一個開源的程式)

https://github.com/jannson/wordmaker/tree/master/src

上面那些程式碼都是出自於scr中的wordmaker.cpp



作者: ren1244    時間: 2017-7-10 01:50 PM

本帖最後由 ren1244 於 2017-7-10 01:52 PM 編輯

搭配 typedef FILE* ptr; 來看
operator ptr() const 應該是轉型運算子
把物件轉型為 FILE* 的函數

至於struct後面的冒號我還在研究...
但很像是繼承


作者: caoh    時間: 2017-7-10 08:41 PM

確實是繼承沒錯,後面那個表示它可以像函數一樣被呼叫 callable object

補充內容 (2017-7-12 10:32 PM):
是的
作者: cockroachrun    時間: 2017-7-11 09:51 AM

C++ 內. struct 跟class 是一樣的東西.
唯一不同點只有 struct 預設的存取權限是public . class 是private

因此. 所有在class 中可用的功能. 在struct 中都可以使用.
作者: superwaterdog    時間: 2017-7-11 09:43 PM

引用class內的函示會用到
繼承內部函式也會用到
只有public才可使用
作者: opchta    時間: 2017-7-11 11:16 PM

ren1244 發表於 2017-7-10 01:50 PM
搭配 typedef FILE* ptr; 來看
operator ptr() const 應該是轉型運算子
把物件轉型為 FILE* 的函數

可是把const放在ptr()後有點其怪吔,而且我在vs 2015中有試過宣告WrapFile這個類別,但vs 2015直接說這個宣告錯誤,它顯示兩個錯誤,operator的地方:
int WrapFile::FILE* ptr() const遺漏明確定類型(假設為'int'),找不到operator ptr的函式定義。

prt()的地方:
int WrapFile::FILE* ptr() const 必需是運算子,找不到operator ptr的函式定義。
作者: opchta    時間: 2017-7-11 11:22 PM

cockroachrun 發表於 2017-7-11 09:51 AM
C++ 內. struct 跟class 是一樣的東西.
唯一不同點只有 struct 預設的存取權限是public . class 是private ...

所以我可以了解成,
trie_combine_t(ptrie_t pt,WordMaker* maker):ptrie(pt)
                                                         ,pmaker(maker)
                                                         ,word_len(0)
{}
是trie_combine_t這個結構的建構子囉??
作者: snowflying    時間: 2017-7-13 01:39 AM

opchta 發表於 2017-7-11 11:16 PM
可是把const放在ptr()後有點其怪吔,而且我在vs 2015中有試過宣告WrapFile這個類別,但vs 2015直接說這個 ...

const 放在函式後面,指的是這個函式無法修改這個物件
跟 const object 和 mutable 有關
與回傳的是 const 型態不一樣

作者: opchta    時間: 2017-7-16 11:06 AM

本帖最後由 opchta 於 2017-7-16 11:08 AM 編輯
opchta 發表於 2017-7-11 11:16 PM
可是把const放在ptr()後有點其怪吔,而且我在vs 2015中有試過宣告WrapFile這個類別,但vs 2015直接說這個 ...

了解,感謝各位大大的回答。
關於「int WrapFile::FILE* ptr() const遺漏明確定類型(假設為'int'),找不到operator ptr的函式定義。」的問題,小弟後來自己找到原因了,是因為小弟習慣把private宣告在public的後面,在該程式中,ptr是private而且是先被宣告的,小弟自己練習的時候則是宣告在後面,當然找不到。囧rz




歡迎光臨 伊莉討論區 (http://s03.p01.eyny.com/) Powered by Discuz!