2016-06-04 6 views
0

Hallo, ich versuche, eine Extendible Hashtable zu implementieren. Mein Problem ist: Ich habe eine Add-Funktion, wo ich entscheide, wann ich einen Bucket splitten soll und wenn ich es teile, wie viele neue Buckets ich brauche. Also erstelle ich nach einer if-Anweisung ein Array von Objekten. Bisher ist keine Probleme, jetzt will ich das Array in einer anderen Funktion drucken genannt:C++ das Erstellen eines Array von Objekt in einer Funktion muss das Array im globalen Bereich verwenden

std::ostream& print(std::ostream& o)

dies ist eine Funktion, die den < < Operators Überlastung, wie Sie in dem Header Container sehen:

virtual std::ostream& print(std::ostream& o) const = 0; 
inline std::ostream& operator<<(std::ostream& o, const Container<E>& c) { return c.print(o); } 

So jetzt meine Add-Funktion folgt:

template <typename E> 
void ExHashing<E>::add(const E e[], size_t len) { 
    if(isfirstBucket(head)){ 
     fill_first_bucket(head, last, e,len,bucket); 
    } 
    else { 
     int number = 2; 
     Bucket<E> buckets = new Bucket<E>(number); 
     Bucket<E>* bucket_Pointer = buckets[1]; 
     bucket_Pointer->Set_local_depth(1); 
    } 
} 

können Sie sehen, dass ich eine Reihe von Bucket machen Objekte, die gut funktionieren, ich kann sie einfach nicht in meiner Druckfunktion ausdrucken, weil Buckets dort nicht definiert sind. Meine Druckfunktion:

template <typename E> 
std::ostream& ExHashing<E>::print(std::ostream& o) const { 
    size_t number_of_buckets = (1 << global_depth); 
    for (size_t i = 0; i < number_of_buckets; ++i) { 
     o << "Bucket size = " << buckets->bucket_size; << " " << "Bucket index = " << buckets[i]->index << " " << "Global depth = " << global_depth << " " << "Local depth = " << buckets[i]->local_depth << "\n"; 
     for (size_t j = 0; j < buckets[i]->bucket_size; ++j) { 
      o << " Bucket value " << "[" << j << "]" << " = " << buckets[i]->displayValues(j)<<"\n"; 
     } 
    } 
    return o; 
} 

Also wie gebe ich meine Druckfunktion Zugriff auf die Array-Buckets? Ich kann keinen Parameter zum Funktionsdruck hinzufügen, da ich gerade den Comad-Druck von der Shell erhalte und meine Daten in den Buckets anzeigen sollte. Wo initialisiere ich mein Array? Ich kann es nicht im Konstruktor machen, da ich nicht weiß, wie viele Daten jemand in das Programm eingibt.

Antwort

0

Container speichern die erforderlichen Eintrittspunkte für die gehaltenen Daten als Mitglieder des Objekts. In Ihrem Fall würden Sie den Zeiger auf die Eimer speichern (und alle anderen administrativen Daten, die Sie benötigen):

template <typename E> 
class ExHashing { 
    Bucket<E>* buckets; 
public: 
    ExHashing(): buckets(0) {}    // Make sure the pointer is initialized. 
    ExHashing(ExHashing const&);    // You'll likely need a copy ctor, 
    ~ExHashing();       // a destructor, 
    ExHashing& operator= (ExHashing const&); // and copy assignment. 
    // as well as other mmebers 
}; 

Beim Erstellen oder Zugriff auf Ihre Eimer Sie this->buckets statt einer lokalen Variablen verwenden würde.

+0

Danke für die Antwort. Eine weitere Frage sollte ich nicht den CopyConstructor und die Opy Zuordnung in meiner Klasse Bucket machen, da ich den Bucket zu einem größeren Array ändern möchte? – Thor

+0

@Thor: Die Klassenvorlage 'Bucket' muss diese Operationen möglicherweise ebenfalls implementieren. Da Sie einen Zeiger auf "Bucket " zuweisen, müssen Sie es freigeben, d. H. Sie haben einen Destruktor, der das Objekt löscht. Die generierten Kopiervorgänge kopieren einfach den Zeiger und Sie erhalten doppelte 'Lösch's für ein Objekt. Also müssen Sie sie entweder definieren oder zumindest deaktivieren. BTW, die relevante "Währung" bei Stackoverflow ist nicht "Danke", sondern Upvotes und akzeptiert. ... und Fragen sind wohl, Fragen, nicht Kommentare: Ich bin mir ziemlich sicher, dass eine ähnliche Frage in der Vergangenheit beantwortet wurde. –

Verwandte Themen