我正在嘗試爲std::vector
創建一個容器類,以教會自己更多地瞭解模板,重載操作符和管理異常。std ::向量segfaulting而不是拋出異常
目前,我只是定義了基本操作。我有一個下面列出的模板類;我已將+=
和[]
運算符重載爲push_back
vector
和T
,並分別直接訪問該向量的元素。這按預期工作。
+=
運算符做它應該做的事情,並試圖在超出範圍的元素上使用運算符[]
將按預期拋出異常。
這裏是原型類和實施,因爲它目前爲:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
template <class T>
class Inventory
{
public:
void operator += (const T& b) { backpack.push_back(b); }
T operator [] (const unsigned& b)
{
if (backpack.empty() || backpack.size() < b)
throw string("Out of Range");
return backpack[b];
}
void operator -= (const unsigned& b)
{
if (backpack.empty() || backpack.size() < b)
throw string("No such element exists.");
backpack.erase(backpack.begin() + b);
}
private:
vector<int> backpack;
};
int main()
{
Inventory<int> pack;
pack += 2;
pack += 4;
try
{
cout << "It was " << pack[0] << endl;
cout << "It was " << pack[1] << endl;
pack -= 0;
cout << "It is now " << pack[0] << endl;
//pack -= 1; // Segfaults?
}
catch (string e)
{
cout << "Error: " << e << endl;
}
}
的問題是與運營商-=
,打算在右手側指示的位置來消除的元素。當我停留在矢量的邊界內時,它會按預期工作;但是,如果我指定要擦除的越界數,我不會收到例外;我得到一個seg-fault。我試圖通過添加額外的打印命令來確定段錯誤的確切點:
void operator -= (const unsigned& b)
{
cout << "In Overload!\n";
if (backpack.empty() || backpack.size() < b)
{
cout << "Exception!\n";
throw string("No such element exists.");
}
backpack.erase(backpack.begin() + b);
}
「異常!」線路永遠不會到達。程序在達到該點之前出錯,儘管我應該評估未定義的行爲。我相信我錯過了理解這個過程如何工作的關鍵組件。有沒有一種方法我應該寫這個,所以它可以拋出而不是過錯?
在Linux x64體系結構上使用g++ -std=c++17 -Wall -Wextra -pedantic
編譯。
爲什麼不簡單地使用'std :: vector :: at()'而不是自己寫一個無效索引的測試呢? 'vector :: at()'保證會拋出一個'out_of_range'異常。 – PaulMcKenzie
「這個」例外!「cout永遠不會到達,程序在達到該點之前就會出錯」 - 您怎麼知道程序將會到達那個點?也許它去了,叫'backpack.erase'。 – immibis
@PaulMcKenzie也許這是一個編碼練習。 – immibis