2016-10-11 30 views
0

私はC++の継承について学びたいと思っています。私はvector::vectorのサブクラスには、ポインタが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])を尊敬しようとすると、私は例外を得る。私がどこに間違っているのか誰にでも教えてくれますか?

答えて

3

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

あなたは、文字列のアドレスをプッシュしていませんでした - のアドレスを文字列へのポインタにプッシュしました。また、連続した呼び出しでは、2つの異なるポインターが同じ場所に格納されていた可能性があります(ただし、別の時に)。

ベクトルがになり、すべてのポインタがに変換される可能性があるため、コンパイラはエラーを警告する機会がありませんでした。おそらく、std::vector<std::string*>またはstd::vector<const std::string*>を使用します。あなたはshouldn't inherit from the standard collectionsです。代わりにそれらをメンバーとして使用することをお勧めします。

これは、void*とキャストの危険性のレッスンです。

+0

私はポインターと参照によって非常にすぐに混乱する唯一の人ですか?私は私が知的だと思っていました! – Aidenhjj

+3

ポインタが混乱しています。幸運なことに、現代のC++やC++ 03以降のように直接扱う必要はありません。難しい経験を持つ人々によって書かれた優れたリソースがあります。あなたは実験や学習によって正しいことをやっています。 –

+1

あなたが問題を無関心の1つの領域に限定することができれば、あなたは両方とも個別に快適になるまで継承とポインタを混ぜることをお勧めします。 –

7

&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] << " "; 
+0

回答とアドバイスありがとうございます。私はそれを試みましたが、 '' push_back(const string *&) 'の呼び出しでは ''一致する関数がありません。 – Aidenhjj

+1

ああ、const文字列へのポインタを取っている。編集されました。 – krzaq

+3

'push_back()'を省略し、継承したものをお楽しみください。 –