2009-12-23 18 views
2

我想擴展C++字符串類返回新實例,返回子類的引用(而不是父串參考),但是這個代碼摘錄...正確的方式從C++字符串的子類

#include <string> 
using namespace std; 

class mystring : public string 
{ 
public: 
mystring& left(int cnt) 
{ return (mystring&)mystring(substr(0,cnt)); 
} 
}; 

產生這種VS8編譯器錯誤:

error C2440: '' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'mystring'

什麼是聲明的MyString正確的方式::左(),所以編譯器將停止抱怨,希望也消除了投?

+1

請解釋爲什麼你認爲你需要繼承的std :: string這樣。 – 2009-12-23 20:43:39

+0

我正在重用使用MFC CString的代碼,該代碼使用了C++字符串中沒有的Left,Right和其他函數 – Mike 2009-12-23 20:56:00

+1

std :: string和MFC CString不兼容。你最好的辦法是把像mfc.Left(3)這樣的東西變成像 Left(stds,3)這樣的免費函數。 – 2009-12-23 21:02:12

回答

4

問題似乎是substr返回std::string,而不是您的子類的一個實例。你有一個mystring::mystring(const std::string&)構造函數嗎?

爲什麼在地球你是否繼承了std :: string呢? :D

寫一個自由函數而不是子類可能會更好。

#include <string> 

namespace mystring { 
    std::string left(const std::string& str, int cnt) 
    { 
    return str.substr(0,cnt); 
    } 
} 
+0

+1,但刪除「可能」;-)來自其他語言的C++程序員只需接受並非所有C++應該都是成員函數。即使您看到中的免費功能有多麼有用,這也難以同化。我發現Herb Sutter的這篇文章提供了幫助:http://www.gotw.ca/gotw/084.htm。但就我而言,在我到達C++之前,我被Python軟化了。非成員'len'可能總會讓我大失所望...... – 2009-12-23 23:36:05

6

error C2440: '' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'mystring'

從MSDN頁面上C2440:

C2440 can also occur for an incorrect use of a user-defined conversion. For more information on user-defined conversions, see User-Defined Conversions). The following sample generates C2440.

你打這個錯誤是因爲你正試圖通過引用返回一個基類對象派生類的對象。它運作良好。因此,你需要演員 - 這是不好的。

標準容器(包括std::string)不適合繼承,請使用聚合。

你不需要劇組到string&

嘗試這樣:

#include <string> 
using namespace std; 

class mystring  { 
public: 
// create an appropriate conversion op/ctor between string -> mystring 
mystring(string const& s) : impl(s) {} 
mystring left(int cnt) 
{ 
    return mystring(impl.substr(0,cnt)); 
} 
string impl; 

}; 
+0

直接使用示例仍然給出* C2440 * - mystring不能從std :: string構造,因爲它沒有構造函數需要std: :字符串或它可以轉換成的類型。 – 2009-12-23 21:11:18

+0

也許你應該注意*爲什麼* std :: string'不應該被子類化。例如,破壞者和所有可愛的東西。 – greyfade 2009-12-23 21:13:05

+0

對不起,但我沒有得到繼續upvotes:在問題的上下文中,它是錯誤的 - OP正試圖從'std :: string'構造一個'mystring'的實例,它不起' mystring'不能從'std :: string'構造。 – 2009-12-23 21:31:54

3

std名稱空間中從類派生的時候要小心。

查看permalink從peterchen回答我自己的問題。

編輯:永久鏈接引用文章的本質是:你可以從std :: string派生。但是你不應該引入一個新的成員變量。

1

編譯器已經告訴你問題是什麼 - 它不能從std::string轉換爲mystring,因爲你的類不能從std::string構建。

您不應該繼承標準庫類型,但是它們不適用於此 - 使用組合。

如果我們暫時擱置該問題:
您需要提供一個構造函數,其格式爲std::string。但是這仍然會產生一個問題:您正在返回一個臨時引用 - 只是在這裏返回值。

你的類現在看起來是這樣的:

class mystring 
{ 
    std::string m_string; 
public: 
    mystring(const std::string& s) : m_string(s) {} 

    mystring left(std::string::size_type cnt) { 
     return m_string.substr(0,cnt); 
    } 
}; 
相關問題