gpt4 book ai didi

c++ - 从 Vector::Vector 基类继承

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:39 24 4
gpt4 key购买 nike

我正在尝试学习 C++ 中的继承。我正在尝试制作一个仅采用 string 指针的 vector::vector 子类。

无可否认,我对指针和引用的掌握很薄弱,但我终究无法理解为什么以下代码将每个 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])时;我得到一个异常(exception)。谁能告诉我哪里出错了?

最佳答案

您正在插入 &str它采用指针的地址,因此您推送的类型是 string** .更重要的是,您正在存储一个短期变量(指针)的地址——一旦您离开重载的 push_back,它就会被销毁。 .

直接的解决方法是简单地更改 push_back方法(删除字符串上的 const 并将指针传递给 vector::push_back ):

void push_back(string* str) {
vector::push_back(str);
}

这与简单地完全删除该方法并使用继承的方法一样好。

话虽如此,从大多数标准容器继承并不是一个好主意。你可以有一个vectorstring只需输入 vector<string*> 即可获取指针.

如果你想打印字符串值而不是指针,你需要取消引用它们:

for (int i = 0; i < 2; i++)
cout << *sv[i] << " ";

关于c++ - 从 Vector::Vector 基类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39983024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com