簡體   English   中英

從Vector :: Vector基類繼承

[英]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*>即可獲得一個vectorstring指針。

如果要打印字符串值而不是指針,則需要取消引用它們:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM