2017-03-03 74 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)); 

}