2014-07-14 87 views
-1

我有這個C++類。C++從類到char的隱式轉換*

class Dinosaur { 
    public: 
     Dinosaur(); 
     ... 
    private: 
     char* name_str_pointer; 
     ... 
} 

我試圖使用從恐龍隱式轉換爲char *所以這行的工作比較「迅猛」name_str_pointer

Dinosaur d(); 
strcmp(d, "velociraptor"); 

它返回

error: cannot convert ‘const Dinosaur’ to ‘const char*’ for argument ‘1’ to ‘int strcmp(const char*, const char*)’ 

我怎樣才能做到這一點?

+0

詳細的,請看在隱式轉換部分['operator const char *()'](http://stackoverflow.com/a/16615725/2296458) – CoryKramer

+5

'Dinosaur d();'不創建對象實例,它聲明瞭一個函數。 – interjay

+1

這看起來(強烈)像x-y問題。在C++中,你不應該使用char *來存儲類中的數據。看看'std :: string','std :: vector '或'std :: array '而不是(取決於代碼中的要求)。由於您在客戶端代碼中使用了'strcmp',因此您應該使用'std :: string'而不是'char *'。無論哪種方式,如果您需要將實例與客戶端代碼中的字符串進行比較,那麼您的類應該實現一個'bool操作符==(const std :: string&)const'。 – utnapistim

回答

2

請嘗試以下

class Dinosaur { 
    public: 
     Dinosaur(); 
     operator char *() const { return name_str_pointer; } 
     ... 
    private: 
     char* name_str_pointer; 
     //... 
}; 

//... 

Dinosaur d; 
strcmp(d, "velociraptor"); 

考慮到,你要分配足夠的內存在默認的構造函數,以適應字符串字面量「迅猛」 name_str_pointer指出帳戶。還需要定義複製構造函數,複製賦值運算符和析構函數。在任何情況下,這樣的做法是不安全

這將是如果不是指針好得多,動態分配的內存,你會使用標準的類std::string

例如

class Dinosaur { 
    public: 
     Dinosaur(const std::string &name) : name_str_pointer(name) {} 
     operator const std::string &() const { return name_str_pointer; } 
     ... 
    private: 
     std::string name_str_pointer; 
     //... 
}; 
+0

謝謝。我正在嘗試運算符重載,但我不知道如何處理這種情況。我知道如何重載一些運營商,但我不知道這種(轉換運營商)。是的,它會更好地使用字符串,但我正在學習c + +,似乎我不允許使用它。 –