2013-04-20 118 views
0

所以,當你知道: 空調風格字符串是一個字符數組,與「空」接受C++字符串&C風格的字符串泛型類

C++風格的字符串結尾:

string s = "Some text"; 

所以要接受C++字符串和C風格的字符串,我很確定我必須使用C++模板。

我想寫一個類和一個方法,返回C++或C風格字符串的字符串的第二個字符。我在正確的軌道上嗎?

template <class T> 
    class mystring { 
    T pointer; 

    public: 
    mystring(T input) { pointer = input } 
    char getSecondLetter() { 
     T temp = pointer; 
     temp++; 
     return temp; 
    } 
}; 

int main() { 
    mystring<I dont know what to put> myobject("HELLO"); 
    cout << myobject.getSecondLetter(); 
    return 0; 
} 

p.s.程序員總是使用'​​T'作爲模板類的數據類型嗎?

+1

定義「接受」。有沒有一種'std :: string'不會爲你做,你需要(在回答這個問題時,考慮一下'c_str()'成員,它允許它在外部呈現爲一個以null結尾的字符串)。 ?除此之外,它必須是一個階級/方法嗎?爲什麼不只是一對重載功能? – WhozCraig 2013-04-20 04:48:04

+0

對不起,我不明白你的評論=(我試圖實現我自己的函數/類,而不使用給定的庫函數,它將接受c或cpp字符串並對字符串進行一些操作 – 2013-04-20 04:50:37

+0

@JL不,程序員並不總是使用'T',但它是標準的。 – timss 2013-04-20 04:51:47

回答

4

沒有必要,C柱隱皈依的std :: string

char getSecondLetter(const std::string & s) { 
    return s[1]; 
} 

const char *c_str = "hello"; 
std::string str = "world"; 

getSecondLetter(c_str); // e 
getSecondLetter(str);  // o 
+0

謝謝。但我已經知道c_str()方法,並不想使用它。我試圖練習「泛型類」,並試圖學習如何使用泛型類來接受c風格的字符串或cpp字符串,並執行諸如在索引X返回字符或大寫字符等操作等。 – 2013-04-20 04:53:53

+0

更好地使用const char * c_str =「hello」'因爲字符串文字不被使用'char *'。 – taocp 2013-04-20 04:53:54

+0

易失性指針'c_str'將被自尊的現代C++編譯器標記爲不建議使用的功能。它應該被聲明爲一個初始化數組或者一個'const char *'符合。 – WhozCraig 2013-04-20 04:55:02

0

你並不需要爲這個模板 - 可以真正地使用此:

class mystring { 
    std::string str; 
public: 
    mystring(std::string input) : str(input) {} 
    char getSecondLetter() { 
     return str[1]; 
    } 
}; 

由於性病:: string有一個構造函數,當你編寫mystring("hello")時,你的const char *在被傳遞給你的類構造函數之前將被使用字符串構造函數隱式轉換爲std :: string。

+0

避免雙重結構,'常量的std :: string&input'會是一個更好的匹配,但即使如此,這使得輸入,這我不相信的OP正在尋找(這並不奇怪)的副本。 – WhozCraig 2013-04-20 05:00:47

3

你可以做一個模板:

template<typename Str_T> 
char getSecondLetter(Str_T const & str) { return str[1]; } 

這將允許std::stringchar const*。但它也將允許發生其他任何碰巧有返回char或可轉換爲char的東西的operator[](例如,std::vector<char>std::deque<char>)。如果你想限制它只是std::stringchar const*,那麼你可以寫兩個重載:

char getSecondLetter(std::string const & str) { return str[1]; } 
char getSecondLetter(char const * str) { return str[1]; } 

當然,你也可以做其他人已經表明,只是做一個版本,需要std::string。但請注意,如果您傳遞一個c字符串,轉換爲std::string可能會導致內存分配,只有在函數結束時纔會釋放內存分配。

+0

+1多用途結果是獎金,至少會讓OP考慮模板如何擴展以涵蓋比他首先考慮的要多的內容。很好的答案。 – WhozCraig 2013-04-20 05:04:16

+0

嗯..是的,理論上我只想要std :: string&char const *,但是如果使用了兩個重載方法,我不認爲該類被認爲是泛型類。函數的參數已經定義了數據類型,而不是通用的。我對嗎? – 2013-04-20 05:40:52

0

的boost :: string_ref可能是你在找什麼:[http://www.boost.org/doc/libs/1_53_0/libs/utility/doc/html/string_ref.html]

它是一個輕量級的類,可以由字符串或c數組構成,它支持std :: string接口的不可變部分。