[英]Inheritance from Vector::Vector base class
我正在嘗試學習C ++中的繼承。 我試圖做一個vector::vector
的子類,它僅使用string
指針。
我對指針和引用的把握確實很弱,但是我無法終生弄清楚為什么以下代碼將每個string
設置為相同的地址:
#include <iostream>
#include <vector>
using namespace std;
class StringVector : public vector<void*> {
public:
void push_back(const string* str) {
vector::push_back(&str);
}
string* operator[](int pos) {
return (string*)vector::operator[](pos);
}
};
main() {
StringVector sv;
string str1 = "hello";
string str2 = "world";
sv.push_back(&str1);
sv.push_back(&str2);
for (int i = 0; i < 2; i++)
cout << sv[i] << " ";
}
按原樣運行時,我得到:
0xffffcb68 0xffffcb68
即相同的地址。
當我嘗試尊重sv[i]
(即*sv[i]
)時; 我有一個例外。 誰能告訴我我要去哪里錯了?
您要推送&str
並獲取指針的地址 ,因此您要推送的類型是string**
。 而且,您存儲的是一個壽命很短的變量(指針)的地址-一旦離開重載的push_back
它就會被銷毀。
立即修復是簡單地更改push_back
方法(刪除字符串上的const
並將指針傳遞給vector::push_back
):
void push_back(string* str) {
vector::push_back(str);
}
這與完全刪除該方法並使用繼承的方法一樣好。
話雖這么說,從大多數標准容器中繼承是一個壞主意。 您只需輸入vector<string*>
即可獲得一個vector
的string
指針。
如果要打印字符串值而不是指針,則需要取消引用它們:
for (int i = 0; i < 2; i++)
cout << *sv[i] << " ";
在此功能
void push_back(const string* str) {
vector::push_back(&str);
}
您沒有推送字符串的地址-您已將指針的地址推送到字符串。 在連續的調用中,兩個不同的指針可能存儲在同一位置(盡管時間不同)。
因為您的向量采用void*
並且任何指針都可以轉換為void*
,所以編譯器沒有機會警告您錯誤。 您可能想要使用std::vector<std::string*>
或std::vector<const std::string*>
。 您不應從標准集合中繼承 ; 寧願使用它們作為成員。
將本課程視為關於void*
和演員轉換危險的一課!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.