我试图了解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] << " ";
}
Run Code Online (Sandbox Code Playgroud)
当我按原样跑时,我得到:
0xffffcb68 0xffffcb68
Run Code Online (Sandbox Code Playgroud)
即同一地址.
当我试图尊重sv[i](即*sv[i]); 我得到一个例外.谁能告诉我哪里出错了?
你正在推动&str哪个获取指针的地址,所以你要推的类型是string**.更重要的是,你正在存储一个短期变量(指针)的地址 - 一旦你离开你的重载就会被破坏push_back.
立即修复是简单地更改push_back方法(删除const字符串并将指针传递给vector::push_back):
void push_back(string* str) {
vector::push_back(str);
}
Run Code Online (Sandbox Code Playgroud)
这与简单地完全删除方法和使用继承方法一样好.
话虽这么说,从大多数标准容器继承是一个坏主意.你可以有一个vector的string只需键入指针vector<string*>.
如果要打印字符串值而不是指针,则需要取消引用它们:
for (int i = 0; i < 2; i++)
cout << *sv[i] << " ";
Run Code Online (Sandbox Code Playgroud)