2017-07-10 7 views
1

Ich versuche nur, C++ zu bekommen und das zu tun, ich muss meine eigenen Bibliotheken und was nicht. Also versuche ich, die Anfänge meiner eigenen List-Template-Klasse genau wie die List-Klasse im JDK zu bekommen. Also habe ich die Vorlage und die Sachen runter, ich will nur wissen, wie ich es machen würde, damit ich den Inhalt eines Listenobjekts durchlaufen könnte. Auf diese Weise kann ich den Inhalt des Objekts ausdrucken. Ich weiß nicht genau, wo ich anfangen soll.Wie durchläuft benutzerdefinierte Liste in C++

#pragma once 

template<typename T> class List { 
public: 
    List() : _size(0), _elements(nullptr) {} 
    ~List() { 
     if (_elements != nullptr) { 
      delete[] _elements; 
     } 
    } 

    inline int size() { return _size; } 

    inline void add(T element) { 
     _size++; 

     T* buffer = new T[_size]; 

     if (_elements != nullptr) { 
      memcpy(buffer, _elements, sizeof(T) * (_size - 1)); 
      delete[] _elements; 
     } 

     buffer[_size - 1] = element; 
     _elements = buffer; 
    } 

    inline void remove(T element) { 
     _size--; 

     T* buffer = new T[_size]; 

     if (_elements != nullptr) { 
      memcpy(buffer, _elements, sizeof(T) * _size); 
      delete[] _elements; 
     } 
     else { 
      assert(false); 
     } 

     _elements = buffer; 
    } 

    inline T* getElements() { 
     return _elements; 
    } 
private: 
    int _size; 
    T* _elements; 
}; 

Und das ist meine Haupt CPP-Datei

#include <cstdio> 
#include <string> 

#include "List.h" 

using namespace std; 

int main(int argc, char ** argv) 
{ 
    string str = "This is a test!"; 
    List<char> list = breakString(str); 
    for (char c : list.getElements()) { 

    } 
    getchar(); 
    return 0; 
} 

List<char> breakString(string str) { 
    List<char> list; 
    for (char c : str) { 
     list.add(c); 
    } 
    return list; 
} 

Also, was ich versuche, dass, um herauszufinden, für Schleife ist, bin ich früher wobei ein for-Schleife verbessert wie in Java , und ist das das gleiche hier in C++? Wenn ja, wie würde ich dieses Objekt iterierbar machen?

Ich dachte, ich würde eine genauere Antwort auf meine Frage bekommen, wenn ich direkt fragen würde.

+1

Mögliches Duplikat genannt [Wie meinen benutzerdefinierten Typen machen arbeiten ?] (ht tps: //stackoverflow.com/questions/8164567/how-to-make-my-custom-type-to-work-with-range-based-for-loops) – Azeem

Antwort

1

Die Richtlinien für die Range-based for Validierung können auf http://en.cppreference.com/w/cpp/language/range-for

gefunden werden, wenn range_expression Ausdruck eines C-Klasse Typ ist, der ein Mitglied beginnen und/oder ein Mitglied namens Ende (unabhängig von der Art benannt hat oder Zugänglichkeit eines solchen Members), dann begin_expr ist __range.begin() und end_expr ist __range.end();

Kurz gesagt, da Ihre Daten in einem rohen Array ist, sollten Sie diese öffentlichen Methoden Ihnen Klasse List<T>

T* begin() { return _elements;} 
T* end() { return _elements + _size;} 

hinzufügen Und dann können Sie aufrufen, der Range-basierte for auf dem Objekt direkt:

for (char c : list) 

Aber Sie haben andere Probleme in Ihrem Code. Einer von ihnen (nicht sicher, es ist der einzige) ist, dass breakString ein Objekt zurückgibt, aber Ihre Klasse ist nicht trivial und es definiert keine copy oder move Konstruktoren.

Diese Antwort adressiert die "Haupt" Frage, wie die Range-based for für Ihre Klasse aktivieren. Es braucht nur zwei Methoden begin() und end(), die etwas zurückgeben, die wie ein Iterator sieht (könnte ein tatsächliches Iterator oder ein Zeiger auf einen zusammenhängenden Speicher Brocken sein ")

Sie können die vorgeschlagenen Änderungen testen, ohne breakString zu verwenden, wie dies :

int main(int argc, char ** argv) 
{ 
    std::string str = "This is a test!"; 
    List<char> list; 
    for (char c : "abcdef") { list.add(c); } 

    for (char c : list) { std::cout << c << "\n"; } 
} 

Und damit es mit „bereichsbasierte for-Schleifen“ „voll iterable“ definieren können Sie eine verschachtelte Klasse definieren ierator ..