一直没解决的问题!

exlixang 2007-06-03 06:52:59
truct __erosionSimpleTool
{//次程序仅仅对2值图象做处理!
const int ersionTemplateA[2][2]
const int ersionTemplateB[2][2];
const int ersionTemplateC[2][2];
const int ersionTemplateD[3][3];
const int ersionTemplateE[3][3];
__erosionSimpleTool():
ersionTemplateA[2][2]={{1,1},{1,1}},
ersionTemplateB[2][2]={{0,1},{1,0}},
ersionTemplateC[2][2]={{1,0},{1,1}},
ersionTemplateD[3][3]={{1,1,1,},{1,1,1},{1,1,1}},
ersionTemplateE[3][3]={{0,1,0},{1,1,1},{0,1,0}}
{};
我知道这是错的!但如何正确的将这些二维数组赋给相应的数据成员呢?

};
...全文
275 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2007-06-04
  • 打赏
  • 举报
回复
用boost::multi_array
exlixang 2007-06-04
  • 打赏
  • 举报
回复
但是不能cout<<tool.E.value[i][j]这样
error C2676: binary '[' : 'const Matrix<2,2>' does not define this operator or a conversion to a type acceptable to the predefined operator
如何重载[][]看来非长困难!希望大家指点!
Vitin 2007-06-03
  • 打赏
  • 举报
回复
赞同lightnut的方法.
在此基础上如果重载operator[]并使用Proxy技术(Proxy类继续重载operator[]),就可以直接支持二维数组的[][]语法了。
lightnut 2007-06-03
  • 打赏
  • 举报
回复
我不想去掉const又想对其初试话,有办法么?
====>
有必要吗?
Vitin(卫亭) 的方法可行.

下面这个比较难看点, 目的是尽量模仿数组的初始化:
#include <iostream>

template <int nRow, int nCol>
class Matrix
{
};

template<>
class Matrix<2,2>
{
public:
Matrix(int a00, int a01, int a10, int a11)
:nRows(2), nCols(2)
{
value[0][0] = a00;
value[0][1] = a01;
value[1][0] = a10;
value[1][1] = a11;
}
int value[2][2];
int nRows;
int nCols;
};

template<>
class Matrix<3,3>
{
public:
Matrix(int a00, int a01, int a02,
int a10, int a11, int a12,
int a20, int a21, int a22)
:nRows(3), nCols(3)
{
value[0][0] = a00;
value[0][1] = a01;
value[0][2] = a02;
value[1][0] = a10;
value[1][1] = a11;
value[1][2] = a12;
value[2][0] = a20;
value[2][1] = a21;
value[2][2] = a22;
}

int value[3][3];
int nRows;
int nCols;

};

struct __erosionSimpleTool
{
const Matrix<2,2> A;
const Matrix<2,2> B;
const Matrix<2,2> C;
const Matrix<3,3> D;
const Matrix<3,3> E;

__erosionSimpleTool();
};

__erosionSimpleTool::__erosionSimpleTool()
:A(1,1,1,1)
,B(0,1,1,0)
,C(1,0,1,1)
,D(1,1,1,1,1,1,1,1,1)
,E(0,1,0,1,1,1,0,1,0)
{

}

int main()
{
using namespace std;

__erosionSimpleTool tool;

cout<<"A=:\n";
for (int i = 0; i<tool.A.nRows; ++i) {
for (int j=0; j<tool.A.nCols; ++j) {
cout<<tool.A.value[i][j]<<"\t";
}
cout<<endl;
}

cout<<"E=:\n";
for (int i = 0; i<tool.E.nRows; ++i) {
for (int j=0; j<tool.E.nCols; ++j) {
cout<<tool.E.value[i][j]<<"\t";
}
cout<<endl;
}

system("pause");
}
Vitin 2007-06-03
  • 打赏
  • 举报
回复
typedef const struct __const__erosionSimpleTool
{
int ersionTemplateA[2][2];
int ersionTemplateB[2][2];
int ersionTemplateC[2][2];
int ersionTemplateD[3][3];
int ersionTemplateE[3][3];
__erosionSimpleTool()
{
... //对每个数组的每个变量初始化

};
} __erosionSimpleTool;

这样__erosionSimpleTool类型保持了常量性,ersionTemplateA等保持只读特性。
sakuraghost 2007-06-03
  • 打赏
  • 举报
回复
lsss正解!
exlixang 2007-06-03
  • 打赏
  • 举报
回复
我不想去掉const又想对其初试话,有办法么?
thankall 2007-06-03
  • 打赏
  • 举报
回复
对,是这个样子的。
星羽 2007-06-03
  • 打赏
  • 举报
回复
楼上正解
lightnut 2007-06-03
  • 打赏
  • 举报
回复
const成员必须在初始化列表中初始化,
但是成员数组不可能在初始化列表中初试化,
所以你要去掉const, 并在构造函数中对
数组元素一一赋值.

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧