2017-02-02 4 views
0

Meine Erfahrung ist bisher in Java, aber ich versuche, C++ zu lernen, und ich habe immer noch Schwierigkeiten, Zeiger, Überladungen usw. zu verstehen. Verzeihen Sie mir über den Titel, aber ich wusste nicht, wie zu präsentieren mein Problem. Jedenfalls bin ich während des Studiums auf diese Übung gestoßen und hätte gerne Hilfe. Die Übung stellt eine Klasse Container und eine main() zur Verfügung, und ich sollte die Klasse erweitern und main() arbeiten lassen, um das richtige Ergebnis zu liefern.Nullpointer Fehler in Übung

template <typename T> 
class Container 
{ 
protected: 
    T * storage; 
    size_t num_items; 
    size_t storage_size; 

public: 
    virtual void operator += (const T item) { } 
    virtual ~Container() { } 
    Container() : storage(nullptr), num_items(0), storage_size(0) { } 
    T operator [] (size_t index) 
    { 
     if (num_items==0) 
     return T(0); 
     return storage[index<num_items?index:num_items]; 
    } 
    inline size_t size() { return num_items; } 
    }; 



void main(int argc, char* argv[]) 
{ 
    Container<long> * store = new Container_ex(); // I'm suppose to fill this gap 
           --------------- 
    size_t num_data; 
    cin >> num_data; 
    for (size_t i=0; i<num_data; i++) 
    { 
     long item; 
     cin >> item; 
     *store+=item; 
    } 
    for (size_t i=0; i<store->size(); i++) 
     std::cout << (*store)[i] << " "; 
    std::cout << std::endl; 
    delete store; 
} 

Bisher habe ich das getan. Das Problem liegt, wenn ich versuche zu überladen + = Ursache ich bekomme einen Ausnahmefehler (this->storage was nullptr) aber auf jeden Fall verstehe ich nicht die Verwendung von Speicher vollständig in dieser Übung, so würde ich jede Hilfe zu schätzen wissen.

class Container_ex : public Container<long> { 
public: 
    Container_ex() : Container() {} 
    ~Container_ex() { delete[] storage; } 
    void operator += (const long item) 
    { 
     *storage = const_cast<long&>(item); 
     *storage = *storage + item; 
     num_items = num_items + 1; 
     storage_size = storage_size + 1; 
    } 

}; 
+0

Wo haben Sie jemals Speicher für 'Speicher' reserviert? –

+0

Sollte ich es innerhalb der Operatorüberladung tun? Weil der angegebene Konstruktor in Container mit null initialisiert wurde –

+0

'Speicher' ist ein Zeiger, aber er zeigt * nirgends *. Sie müssen es irgendwo zeigen, bevor Sie es dereferenzieren können. –

Antwort

0

Ihr Zeiger muss auf eine gültige Speicheradresse zeigen, bevor Sie etwas damit machen können. Ist dies nicht der Fall, führt dies zu undefiniertem Verhalten, das zum Beispiel zu einem Absturz Ihrer Anwendung führen kann.

Aber wann müssen Sie es tun? Sicher nicht in der Bedienerüberlastung. Wenn Sie ein Objekt erstellen, müssen Sie sicherstellen, dass es sich in einem gültigen Status befindet. Es bedeutet, dass Sie es entweder auf nullptr setzen, so dass es ein Null-Zeiger ist, oder Speicher dafür zuweisen.

Wenn Sie eine Überlastung des Bedieners vornehmen, wie können Sie sicher sein, dass die Überlastung des Bedieners verwendet wird? Vielleicht möchte der Benutzer nur [] tun. Sie müssen also einen Konstruktor erstellen, der Speicher für Ihren Zeiger zuweist. Oder, besser, verwenden Sie smart pointers das wird Ihr Leben retten und Kopfschmerzen, vor allem, wenn Sie aus einer Sprache kommen, wo es keinen expliziten Zeiger wie Java gibt.

Endlich gibt es einige großartige Bücher, um C++ besser zu lernen als den Kurs, den Sie verwenden.

  • Programming: Principles and Practice Using C++ von Bjarne Stroustrup, der Schöpfer von C++. Nehmen Sie keine Vorkenntnisse in der Programmierung an. Überprüfen Sie, ob Sie die aktualisierte Version für C++ 11 | C++ 14.
  • C++ Primervon Stanley Lippman, Josée Lajoie und Barbara E. Moo. ~ 1k Seiten, voll mit Details und Erklärungen zu C++ 11. Gut für Anfänger mit einer vorherigen Erfahrung in der Programmierung.