2016-09-19 13 views
-2

これで概念的に苦労しましたが、意図した結果を得る方法がわかりません。私はHashMapクラスを構築していますが、どのメソッドや属性にもアクセスしようとしている間は、エラーを回避する方法がわかりません。私は、ダブルポインタの代わりにベクトルテンプレートを使用する同様のHashMapクラスのテンプレートを持っていますが、ここで私の使用にうまく適合させることができませんでした(ダブルポインターは割り当てのテンプレートにあります)。ここでは、コードの簡素化抜粋です:ポインタをポインタから逆参照する際に問題が発生しました

#include <cstddef> 
#include <string> 
#include <vector> 
#include <iostream> 
using namespace std; 

const int TABLE_SIZE = 128; 

template <typename HashedObject> 
class HashMap { 
    public: 
     HashMap() { 
      table = new HashEntry*[TABLE_SIZE]; 
      for (int i = 0; i < TABLE_SIZE; i++) 
       table[i] = NULL; 
     } 

     enum EntryType { 
      ACTIVE, EMPTY, DELETED 
     }; 

     void test() { 
      // This produces a compile error "request for member 'info' in '*((HashMap<int>*)this)->HashMap<int>::table', 
      // which is of pointer type 'HashMap<int>::HashEntry*' (maybe you meant to use '->' ?)" 
      cout << table[0].info << endl; 
      // But when I use ->, it just crashes at runtime. 
      cout << table[0]->info << endl; 
     } 

    private: 
     struct HashEntry 
     { 
      HashedObject element; 
      EntryType info; 

      HashEntry(const HashedObject & e = HashedObject(), EntryType i = EMPTY): element(e), info(i) {} 
     };   

     HashEntry **table;  
}; 

int main(void){ 
    HashMap<int> hashtable; 
    hashtable.test(); 
    return 0; 
} 

私は、私が最も可能性の高い適切**テーブルを欽慕に失敗していますことを理解し、私は、私はポインタや参照とについて読んだことの合成に苦労していますそれをこのケースに適用する。どんな助けもありがとう。

+1

'テーブル[0]である必要が.info''テーブル[0] - > info' 'テーブル[0]'ポインタであるからです。 –

+1

あなたが持っている唯一の問題なら、この投稿は "typo"エラーで閉じることができます。 –

+0

私の問題は、テーブル[0] - > infoを使用するとクラッシュするようです。 – Brendan

答えて

0
 cout << table[0].info << endl; 

table[0]がポインタであるので

 cout << table[0]->info << endl; 

する必要があります。

逆参照されるときにtable[0]がNULLであるため、プログラムがクラッシュします。

変更を:

 if (table[0] != NULL) 
     { 
      cout << table[0]->info << endl; 
     } 
関連する問題