對於Accelerated C++練習,我正在實現一個名爲Str
的自定義字符串類。當底層存儲容器是一個自定義矢量(Vec
)時,一切正常,但現在我遇到了一個奇怪的情境問題,我不明白。顯式調用非默認ctor時覆蓋自定義字符串失敗
如果我通過顯式調用像Str newStr("some words");
的構造函數,然後創建一個新的Str
對象試圖覆蓋使用它cin >> newStr;
程序崩潰到底,給在調試器SIGABRT當它達到Str
析構函數(這僅僅是delete[] data;
)。
如果我創建一個新的空Str
然後用cin
來填補它像Str newStr; cin >> newStr;
,或者如果我使用cin
覆蓋我做了使用Str newStr = "some words";
一個Str
這不會發生,當我嘗試重寫Str
它只是失敗通過顯式調用非默認構造函數來實現,即使此類型在被覆蓋之前正確顯示。
在這種情況下,另一個奇怪的事情,如果我只是不創建創建/顯示奇數行爲Str
和使用cin
改變其價值之間的任何新Str
5事實上正常工作。
Str a = "Here is a";
Str b("And here is b");
cout << a << endl << b << endl;
Str c = "Finally we have c";
cout << c << endl;
cin >> c;
cout << c << endl << endl;
cin >> b;
cout << b << endl;
這說明你,你可以覆蓋Str c
成功,但是當你試圖覆蓋Str b
崩潰。然而,這可以讓你覆蓋b
和程序成功完成:
Str a = "Here is a";
Str b("And here is b");
cout << a << endl << b << endl;
cin >> b;
cout << b << endl;
Str
包含被同時用於a
和b
私有成員char* data
,int length, limit
和構造是:
Str::Str(const char* cp) {
limit = length = std::strlen(cp);
data = new char[length];
for (size_type i = 0; i != length; ++i)
data[i] = cp[i];
}
我也有>>
好友及其實施是:
istream& operator>>(istream& is, Str& s) {
delete[] s.data;
s.length = s.limit = 0;
char c;
while (is.get(c) && isspace(c)) ;
if (is) {
do s.push_back(c);
while (is.get(c) && !isspace(c));
if (is)
is.unget();
}
return is;
}
我知道push_back
可能是一個奇怪的功能在這個類中,但它工作正常,即使使用cin
很長的Str
需要許多push_back。我試着調整/類的不同部分經營者幾個小時,很爲難O_O
最後,我不知道爲什麼我的副本構造函數不會被調用過程中使用Str newStr = "blah";
Str
初始化(與cout
小號選中)語法,即使它有效。
編輯,的push_back:
void Str::push_back(char c) {
if (length == limit) {
limit = std::max(limit*2, 1);
char* newData = new char[limit];
for (size_type i = 0; i < length; ++i)
newData[i] = data[i];
delete[] data;
data = newData;
}
data[length++] = c;
}
當你使用一個潛在的'的std :: VECTOR' ''push_back()'函數是內置的。現在你正在使用一個字符緩衝區,你必須編寫你自己的'push_back()'。看起來很可能這是錯誤所在。請在這裏發佈信息。 –
當使用'Vec'時,我還必須編寫'push_back()',因爲這個練習涉及到讓一個自定義類像'std :: vector'一樣編輯來顯示我的'Str :: push_back()',似乎在其他情況下工作,當它被稱爲多次覆蓋像'str someStr =「asdf」;' – Instinct
沒有什麼明顯錯誤。如果可以發佈整個源代碼,我會把它放在調試器中,看看會發生什麼。 –