Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Vector::Vector基类继承 我试图学习C++中的继承。我正在尝试创建vector::vector的一个子类,它只接受字符串指针_C++_Vector - Fatal编程技术网

从Vector::Vector基类继承 我试图学习C++中的继承。我正在尝试创建vector::vector的一个子类,它只接受字符串指针

从Vector::Vector基类继承 我试图学习C++中的继承。我正在尝试创建vector::vector的一个子类,它只接受字符串指针,c++,vector,C++,Vector,无可否认,我对指针和引用的把握很弱,但我一辈子都搞不清楚为什么下面的代码会将每个字符串设置为相同的地址: #include <iostream> #include <vector> using namespace std; class StringVector : public vector<void*> { public: void push_back(const string* str) { vector::push_back(&

无可否认,我对指针和引用的把握很弱,但我一辈子都搞不清楚为什么下面的代码会将每个字符串设置为相同的地址:

#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] << " ";
}
i、 e.同一地址

当我试图遵从sv[I]时,即*sv[I];我有个例外。有人能告诉我哪里出错了吗?

您正在按&str,它接受指针的地址,因此您正在按的类型是string**。更重要的是,您正在存储一个短期变量指针的地址——一旦您将重载的push_返回,它就会被销毁

直接的解决方法是简单地更改push_back方法remove const on string并将指针传递给vector::push_back:

这和简单地删除方法并使用继承的方法一样好

也就是说,从大多数标准容器继承是个坏主意。只需键入vector,就可以得到字符串指针的向量

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

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::vector。你更愿意将其用作成员


这是一堂关于虚空和铸型危险的课

谢谢你的回答和建议。我试过了,但没有找到匹配的函数来调用“push_backconst string*&”。@TobySpeight facepalms。正当编辑。我是唯一一个很快被指针和引用弄糊涂的人吗?我过去认为我很聪明!指针令人困惑-不要拖延!幸运的是,你不必直接处理它们,就像C++ 03和更大的C++一样。有一些很好的资源是由具有来之不易经验的人编写的——通过实践和从实践中学习,你正在做正确的事情。当然,在你对继承和指针都感到满意之前,将它们混合使用可能不是一个好主意——如果你能将问题缩小到一个无知的领域,这会有所帮助!前几天我买了一个有效的现代C++ Scott Meyers,但它是真正的C++的人。所以我正在用C++布鲁斯EcCell思考,我认为这有点老了。如果有任何突出的参考资料,我应该阅读-请让我知道。
for (int i = 0; i < 2; i++)
    cout << *sv[i] << " ";
void push_back(const string* str) {
    vector::push_back(&str);
}