2017-03-03 76 views
0

我有一個類定義爲這樣:如何初始化二維數組作爲類變量?

#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); 


}; 

我也有包含這些方法,因爲這樣我的.cpp文件:

#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; 
    } 


} 

現在,這是哪裏出了問題我在主要發生:

#include "VideoSim.h" 



int main(void) 
{ 

    VideoSim v; 
    return 0; 
} 

程序創建一個名爲v的VideoSim對象,但然後崩潰......爲什麼發生這種情況的任何想法?

+0

考慮'的std :: array'數組 –

回答

1

如果要初始化數組中你必須使用初始化語法的所有元素,以0:video[MAX_ROW][MAX_COLUMN] = { 0 };你寫一個零到video[MAX_ROW][MAX_COLUMN]

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

在行這是一個超出界限的錯誤。

你也可以把零初始化類定義爲:

char video[MAX_ROW][MAX_COLUMN]{}; 

如果你最終添加自定義構造函數,那麼你可以只是簡單地覆蓋這個默認初始化通過提供不同的初始化像在上面的構造。

+0

好吧,我的錯誤。謝謝。 – ryyker

+0

使用此解決方案與使用: memset(視頻,0,sizeof(視頻))相比,是否有優勢? 在我的構造函數中? –

+0

是的,這是更明確的,不使用低級別的函數,並且可以更快,因爲您不調用任何函數。編譯器也可以優化零初始化,因爲它是內置類型的默認初始化。 – Klaus

1

最簡單的方法:

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

爲什麼我要補充前面的字符,如果它已經宣佈我的類定義呀? –

+0

此代碼用於類定義。 – Klaus

+0

哦,我明白了,對不起,我不記得爲什麼,但我被教導不要在我的類定義中初始化任何數據,只能在我的構造函數中初始化。 –

0
VideoSim::VideoSim(void) 
{ 

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

}