2017-03-03 2 views
0

Ich habe eine Klassendefinition als solche:Wie initialisiert man 2D-Array als Klassenvariable?

#include <stdio.h> 
#pragma warning(disable:4996) 

#define MAX_ROW 10 
#define MAX_COLUMN 40 

class VideoSim 
{ 

private: 
    char video[MAX_ROW][MAX_COLUMN]; 
    int currentRow; 
    int currentColumn; 


public: 
    VideoSim::VideoSim(void); 
    VideoSim::~VideoSim(void); 
    void clearScreen(void); 
    int setCursorPosition(int row, int column); 


}; 

ich meine CPP-Datei haben auch die diese Methoden als solche enthält:

#include "VideoSim.h" 



VideoSim::VideoSim(void) 
{ 

    currentRow = 0; 
    currentColumn = 0; 
    video[MAX_ROW][MAX_COLUMN] = { 0 }; 

} 

VideoSim::~VideoSim(void) 
{ 
    printf("Dead Video \n"); 
} 

void VideoSim::clearScreen(void) 
{ 

    int count = 0; 
    char *pVideo = video[count]; 

    for (count = 0; count < (MAX_ROW * MAX_COLUMN); count++) 
    { 
     *(pVideo++) = ' '; 
    } 

} 



int VideoSim::setCursorPosition(int newRow, int newColumn) 
{ 
    if (newRow >= 0 && newRow <= MAX_ROW && newColumn >= 0 && newColumn <= MAX_COLUMN) 
    { 
     currentColumn = newColumn; 
     currentRow = newRow; 
     return 0; 

    } 
    else 
    { 
     return 1; 
    } 


} 

Nun ist dies, wo das Problem in meinem Haupt auftritt:

#include "VideoSim.h" 



int main(void) 
{ 

    VideoSim v; 
    return 0; 
} 

Das Programm erstellt das VideoSim Objekt namens v aber dann stürzt ... eine Idee, warum dies geschieht?

+0

Betrachten 'std :: array' für Arrays –

Antwort

1

Wenn Sie alle Elemente auf 0 im Array initialisieren möchten Sie initializer Syntax verwenden:

VideoSim::VideoSim() 
    : video{} 
{ 
    currentRow = 0; 
    currentColumn = 0; 
} 

In der Zeile video[MAX_ROW][MAX_COLUMN] = { 0 }; Sie eine Null zu video[MAX_ROW][MAX_COLUMN] schreiben Das ist ein Fehler außerhalb der Grenzen.

Sie können auch die Null-Initialisierung in der Klassendefinition setzen, wie:

char video[MAX_ROW][MAX_COLUMN]{}; 

Wenn Sie schließlich benutzerdefinierte Konstrukteuren hinzufügen können Sie dann überschreiben nur diese Standardinitialisierung durch eine andere Initialisierung, wie die in den Konstruktor Bereitstellung oben .

+0

Okay, mein Fehler. Vielen Dank. – ryyker

+0

Gibt es einen Vorteil, diese Lösung zu verwenden im Gegensatz zur Verwendung: memset (Video, 0, sizeof (Video)); In meinem Konstruktor? –

+0

Ja, dies ist expliziter, verwendet keine Low-Level-Funktion und kann schneller sein, da Sie keine Funktion aufrufen. Außerdem kann der Compiler die Nullinitialisierung optimieren, da dies die Standardinitialisierung für Einbautypen ist. – Klaus

1

einfachste Weg:

char video[MAX_ROW][MAX_COLUMN] = {{0}};//initialize all elements to NULL 
+0

warum sollte ich habe die Zeichen vor hinzuzufügen, wenn es bereits auf diese Weise in meiner Klassendefinition deklarierte? –

+0

Dieser Code ist für die Klassendefinition gedacht. – Klaus

+0

Oh ich sehe, tut mir leid, ich kann mich nicht erinnern, warum, aber ich wurde gelehrt, keine Daten innerhalb meiner Klassendefinition und nur in meinem Konstruktor zu initialisieren. –

0
VideoSim::VideoSim(void) 
{ 

    currentRow = 0; 
    currentColumn = 0; 
    memset(video,0, sizeof(video)); 

} 
Verwandte Themen