关于如何初始化一个类内的静态二维数组变量问题
2016-12-08 09:37
429 查看
用面向对象写了一个黑白棋的代码, 发现不知道如何去初始化一个静态的二维数组, 编译器总是报错。先给大家看看类内的一些声明吧
在类外,chessmen[9][9]就不知道怎么初始化了。一开始用的memset函数,编译器报错,然后直接给这个二维数组的某个下标所代表的值赋一个初值,编译器也会报错。
然后就想到了一个蠢办法:
也确实没有语法错误了,但总是感觉哪里很不舒服。
上网百度了一下,大致有以下两个办法:
1 构造一个静态成员函数, 用该函数初始化静态二维数组。
2 继承派生, 将该二维数组用一个类封装一下,在新写的类中可以用构造函数解决,思路也很清晰。
下面是我用第一种办法做的一个示例
class chess
{
public:
chess(int a):color(a)
{
num=0;
}
int counter();///计数器,计算棋子个数;
const friend void draw(chess &, chess &);///画出棋盘,每落一子更新一次;
friend int win(chess &, chess &);
void change(int, int, chess &);
static bool judge(int x, int y)
{
if(chessmen[x][y]==1||chessmen[x][y]==-1)
{
cout<<"此处无法落子,请重新设置棋子坐标"<<endl;
return 1;
}
return 0;
}
static void star_chess()
{
memset(chessmen, false, sizeof(chessmen));
chessmen[4][4]=chessmen[5][5]=1;
chessmen[4][5]=chessmen[5][4]=-1;
}
private:
static int chessmen[9][9];
int num;
int color;///黑色为1, 白色为-1, 无子为0;
};
int chess::chessmen[9][9]={{0}};
直接调用star_chess()静态函数完成初始化即可。
class chess { public: chess(int a):color(a) { num=0; } int counter();///计数器,计算棋子个数; const friend void draw(chess &, chess &);///画出棋盘,每落一子更新一次; friend int win(chess &, chess &); void change(int, int, chess &); static bool judge(int x, int y){}; private: static int chessmen[9][9]; int num; int color;///黑色为1, 白色为-1, 无子为0; };
在类外,chessmen[9][9]就不知道怎么初始化了。一开始用的memset函数,编译器报错,然后直接给这个二维数组的某个下标所代表的值赋一个初值,编译器也会报错。
然后就想到了一个蠢办法:
int chess::chessmen[9][9]={ {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, -1, 0, 0, 0}, {0, 0, 0, 0, -1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, };
也确实没有语法错误了,但总是感觉哪里很不舒服。
上网百度了一下,大致有以下两个办法:
1 构造一个静态成员函数, 用该函数初始化静态二维数组。
2 继承派生, 将该二维数组用一个类封装一下,在新写的类中可以用构造函数解决,思路也很清晰。
下面是我用第一种办法做的一个示例
class chess
{
public:
chess(int a):color(a)
{
num=0;
}
int counter();///计数器,计算棋子个数;
const friend void draw(chess &, chess &);///画出棋盘,每落一子更新一次;
friend int win(chess &, chess &);
void change(int, int, chess &);
static bool judge(int x, int y)
{
if(chessmen[x][y]==1||chessmen[x][y]==-1)
{
cout<<"此处无法落子,请重新设置棋子坐标"<<endl;
return 1;
}
return 0;
}
static void star_chess()
{
memset(chessmen, false, sizeof(chessmen));
chessmen[4][4]=chessmen[5][5]=1;
chessmen[4][5]=chessmen[5][4]=-1;
}
private:
static int chessmen[9][9];
int num;
int color;///黑色为1, 白色为-1, 无子为0;
};
int chess::chessmen[9][9]={{0}};
直接调用star_chess()静态函数完成初始化即可。
相关文章推荐
- 静态成员变量初始化问题。关于 error LNK2005 static int:已经在***.obj中定义
- 关于如何使用反射声明一个泛型类型变量(泛型参数是动态的)的问题
- 有关于在Java 类的静态初始化块中创建一个自身实例的问题。
- 关于C#静态变量初始化问题
- 一个关于类的数组成员变量问题
- 一个关于全局变量位置的问题
- 变量初始化问题--一个年轻工程师的见解(2007年工作一年时写的)
- 学习Java的第一步是安装好JDK,写一个Hello World, 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加
- 关于.NET中的静态方法、变量的问题
- 关于java中变量的初始化的问题
- 一个关于如何学习大型数据库问题的问题
- 关于对话框应用程序中的变量应在何处进行初始化的问题
- 关于如何只取得每组数据中的一个最大值的问题?
- 跪求,在线等,一个关于WISE打包写环境变量的问题.很急
- 关于如何计算子网掩码和广播地址的问题的一个例子
- 关于webpart 的问题:一个用户修改了页面布局,如何应用于网站的所有用户?
- 关于JAVA中变量的初始化及类属性的默认值问题
- 问一个关于生成静态页面的问题
- CSDN上的一个问题贴(关于内部类在外部类静态方法中使用问题)
- ASP.Net下如何解决关于Access数据库“操作必须使用一个可更新的查询”问题