2012-12-13 60 views
1

這源於Herb Sutter的gotw3(http://www.gotw.ca/gotw/003.htm)。將班級轉換爲字符串

下面的類和FindAddr功能...

using std::string; 
using std::list; 

class Employee 
{ 
public: 
    Employee(const string& n, const string& a) : name(n), addr(a) { } 
    string name; 
    string addr; 
}; 

string FindAddr(const list<Employee>& l, const string& name) 
{ 
    string addr; 
    list<Employee>::const_iterator i = find(l.begin(), l.end(), name); 

    if (i != l.end()) { 
     addr = (*i).addr; 
    } 
    return addr; 
} 

我得到一個編譯錯誤,因爲Employee類沒有轉換爲字符串。我可以看到,這種轉換並不一定是明智的,但對於練習的目的,我添加了一個天真的轉換:

string::string(const Employee& e) 
{ 
    return e.name; 
} 

這給了我一個錯誤:

gotw3.cc:17:9: error: C++ requires a type specifier for all declarations 
string::string(const Employee& e) 
~~~~~~^

我在做什麼錯誤?

+0

如果您試圖超載鑄件,此鏈接可能會有所幫助:http://www.learncpp.com/cpp-tutorial/910-overloading-typecasts/ – RonaldBarzell

+0

gotw3.cc - 關於Sutter的一些內容? – triclosan

回答

7

有兩件事:第一,如果沒有 修改類定義,則無法添加到現有類。如果您有 要轉換爲std::string(或double或其他)類, 你應該定義一個轉換操作符:在您的情況:

class Employee 
{ 
    // ... 
    operator std::string() const 
    { 
     return name; // Or whatever... 
    } 
}; 

其次,你的情況的解決方案是不提供隱含的 轉換,它是使用std::find_if與適當的 匹配器。在C++ 11中,這可以通過使用lambda來完成,但是在一般情況下(以及舊版本的C++),您始終可以定義一個功能類型 。對於這樣的,其中一類具有 天然的「鑰匙」的情況下,我可能會添加一些成員類,沿 的線路:

class Match : std::unary_function<Employee, bool> 
{ 
    std::string myName; 
public: 
    explicit Match(std::string const& name) 
     : myName(name) 
    { 
    } 
    bool operator()(Employee const& toBeMatched) const 
    { 
     return toBeMatched.name == myName; 
    } 
}; 

附加功能類型定義的順序關係, 或平等鍵,也可能是爲了。

+0

是的。我的一個錯字;我會糾正它。感謝您指出。 –

+0

謝謝。但是,我傳遞給'find_if'的Match類的謂詞函數的名稱是什麼? –

+0

功能對象可以像函數一樣調用;這就是'operator()(...)'的重載所做的事情。您不會將函數傳遞給'find_if',您會傳遞該類的一個實例(例如'Match(whatImLookingFor)')。 –

2

沒有類字符串,有一個類模板std :: basic_string。

你不應該修改標準命名空間中的任何東西。

對於類型爲字符串轉換的目的,你可以添加

Employee::operator std::string()

或定義

std::ostream& operator<<(const Employee& em, std::ostream& os); - 這樣一來你的類型將與lexical_cast工作。

..但你實際需要的是std::find_if()