new 指针的初始化问题

天外小小 2009-05-17 09:08:38

#include <iostream.h>



struct RCV
{
int row,col;
int value;
};


class SMatrix
{

public:
SMatrix(){item=NULL;num=0;};
SMatrix(RCV a[],int co,int ro,int n);
~SMatrix(){cout<<"sd";}
void tran(SMatrix&);
int get(int i,int j);
void print();
private:
RCV *item;
int r,c,num;
};
SMatrix::SMatrix(RCV a[],int co,int ro,int n)
{
int i;
r=ro;c=co;num=n;
item=new RCV[num];
for(i=1;i<=num;i++)
item[i]=a[i];
};
void SMatrix::tran(SMatrix& x)
{

int i,j,k;
x.r=c;x.c=r;x.num=num;
x.item=new RCV[num];
for(i=1;i<=num;i++)
{ x.item[i].value=0;
x.item[i].col=0;
x.item[i].row=0;

cout<<x.item[1].value<<x.item[2].value<<x.item[3].value;}


}

int SMatrix::get(int i,int j)
{

for(int a=1;a<=num;a++)
{if(item[a].col==i&&item[a].row==j)
return item[a].value;
}
return 0;

}

void SMatrix::print()
{

int i,j;
cout<<"-----------------------------"<<endl;

for(i=1;i<=c;i++)
{for(j=1;j<=r;j++)

{cout<<get(i,j)<<" ";}

cout<<endl;}

cout<<"-----------------------------"<<endl;
}

void main()
{
RCV j[100];
int h,l,n;

cout<<"请输入矩阵的大小 行,列"<<endl;
cin>>h>>l;

cout<<"你要输入多少个元素?"<<endl;
cin>>n;

for(int i=1;i<=n;i++)
{cout<<"请输入第"<<i<<"元素所在的行,所在的列,元素的值"<<endl;
cin>>j[i].col>>j[i].row>>j[i].value;}

SMatrix M(j,h,l,n);
//M.print();
SMatrix A;
M.tran(A);
A.print();




}



/* 我只想把哪个CLASS X 初始化 可我那样初始化后 有问题呢?
小弟刚学 不是很懂 NEW这个指针的问题
...全文
365 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
天外小小 2009-05-18
  • 打赏
  • 举报
回复
谢谢大家 现在可以写出来的 不过就是有点小问题 自己解决了哈 谢谢
Jalien 2009-05-18
  • 打赏
  • 举报
回复
atom210 2009-05-17
  • 打赏
  • 举报
回复
没注释 看着累 没看完。。。
ymll1 2009-05-17
  • 打赏
  • 举报
回复

SMatrix::SMatrix(RCV a[],int co,int ro,int n)
{
int i;
r=ro;c=co;num=n;
item=new RCV[num];
for(i=1;i <=num;i++)
item[i]=a[i];
};


你这个搞法对用户要求太高,n为元素总数,所以必须有 n == co*ro对不?
然后RCV中的row,col标示RCV对象在矩阵中的位置,所以的最大值必须与ro,co相等?
不知道我理解的对不对……
这样写的后果就是main函数特别难写,然后乘法实现起来太过复杂导致逻辑混乱

我认为改变要改变这种逻辑混乱,可以用二维数组存储矩阵,这样就不需要定义RCV了
而且元素在矩阵中的位置也可以直接通过索引找到

另外有,item = new RCV[num];
所以析构函数里不能delete item,而是delete [] item

如果你一定要从1开始索引,而且用num标示数组元素总数,可以item = new RCV[num+1]
否则for(i=1;i <=num;i++)的最后一次迭代是越界的,但是如果你改成for(i=1;i <=num-1;i++)的话又少了一个元素,
所以只能在new的时候多加一个元素


BTW,回帖时,输入框上面的按钮中有一个是插入源代码用的,把鼠标放到上面有提示,用那个可以保持你的缩进和关键字着色效果
你这个程序看着累的原因不光是缩进问题,原谅我没看完
天外小小 2009-05-17
  • 打赏
  • 举报
回复
只是为了矩阵相乘而已....
天外小小 2009-05-17
  • 打赏
  • 举报
回复
....那我的怎么不能呢 还抱错

我把我要写的放这里把 不会的地方我都表出来了
#include <iostream.h>



struct RCV
{
int row,col;
int value;
};


class SMatrix
{

public:
SMatrix(){item=NULL;num=0;};
SMatrix(RCV a[],int co,int ro,int n); //co行 ro 列
~SMatrix(){delete item; cout<<"sd";} //delete item 写进去回出错???
int get(int i,int j);
friend void cheng(SMatrix&x,SMatrix a,SMatrix b);
void print();
private:
RCV *item;
int r,c,num;
};
SMatrix::SMatrix(RCV a[],int co,int ro,int n)
{
int i;
r=ro;c=co;num=n;
item=new RCV[num];
for(i=1;i<=num;i++)
item[i]=a[i];

};

int SMatrix::get(int i,int j)
{

for(int a=1;a<=num;a++)
{if(item[a].col==i&&item[a].row==j)
return item[a].value;
}
return 0;

}


void cheng(SMatrix&x,SMatrix a,SMatrix b)
{
int i,j,q,y,z;
x.c=b.r ;x.r=a.c ;x.num=a.num;
if(x.item != NULL){delete []x.item;}
x.item=new RCV[a.num];
for(i=1;i<=a.num;i++)
{
x.item[i].col=0;
x.item[i].row=0;
x.item[i].value=0;

}
for(i=1;i<=a.c;i++)
for(q=1;q<=a.r;q++)
if(a.get(i,q)!=0)

{
for(j=1;j<=b.r;j++)
{


z=(i-1)*b.r+j;//按行排出来的序号 矩阵从A11-Aij都有 不管值是不是0都存了 这里有问题吗?

y=a.get(i,q)*b.get(q,j);

x.item[z].col=i; //这里有问题吗?
x.item[z].row=j; //这里有问题吗?
x.item[z].value+=y; //这里有问题吗?

}

cout<<"ssss"<<x.item[1].value<<x.item[2].value<<x.item[3].value<<"SSS";//为什么是这么大的值 而不是0

}


}



void SMatrix::print()
{

int i,j;
cout<<"-----------------------------"<<endl;

for(i=1;i<=c;i++)
{for(j=1;j<=r;j++)

{cout<<get(i,j)<<" ";}

cout<<endl;}

cout<<"-----------------------------"<<endl;
}

void main()
{
RCV j[100];
int h,l,n;

cout<<"请输入矩阵的大小 行,列"<<endl;
cin>>h>>l;

cout<<"你要输入多少个元素?"<<endl;
cin>>n;

for(int i=1;i<=n;i++)
{cout<<"请输入第"<<i<<"元素所在的行,所在的列,元素的值"<<endl;
cin>>j[i].col>>j[i].row>>j[i].value;}

SMatrix M(j,h,l,n);

SMatrix A=M;
A.print();


RCV d[100];
h=l=n=0;

cout<<"请输入矩阵的大小 行,列"<<endl;
cin>>h>>l;

cout<<"你要输入多少个元素?"<<endl;
cin>>n;

for(int q=1;q<=n;q++)
{cout<<"请输入第"<<q<<"元素所在的行,所在的列,元素的值"<<endl;
cin>>d[q].col>>d[q].row>>d[q].value;}
SMatrix N(d,h,l,n);



SMatrix B=N;
B.print();




SMatrix C;
cheng(C,M,N);
C.print();


}
zhan1094 2009-05-17
  • 打赏
  • 举报
回复
dev cpp编译通过并可以运行~~

天外小小 2009-05-17
  • 打赏
  • 举报
回复
~SMatrix(){delete item;cout <<"sd";} ;
这样写有出错了 !!!!
还有你们的程序怎么弄出来的颜色??
zhan1094 2009-05-17
  • 打赏
  • 举报
回复

#include <iostream>


struct RCV
{
int row,col;
int value;
};


class SMatrix
{

public:
SMatrix(){item=NULL;num=0;};
SMatrix(RCV a[],int co,int ro,int n);
~SMatrix(){delete item;cout <<"sd";} ;
void tran(SMatrix&);
int get(int i,int j);
void print();
private:
RCV *item;
int r,c,num;
};
SMatrix::SMatrix(RCV a[],int co,int ro,int n)
{
int i;
r=ro;c=co;num=n;
item=new RCV[num];
for(i=1;i <=num;i++)
item[i]=a[i];
};
void SMatrix::tran(SMatrix& x)
{

int i,j,k;
x.r=c;x.c=r;x.num=num;
x.item=new RCV[num];
for(i=1;i <=num;i++)
{ x.item[i].value=0;
x.item[i].col=0;
x.item[i].row=0;

cout <<x.item[1].value <<x.item[2].value <<x.item[3].value;}


}

int SMatrix::get(int i,int j)
{

for(int a=1;a <=num;a++)
{if(item[a].col==i&&item[a].row==j)
return item[a].value;
}
return 0;

}

void SMatrix::print()
{

int i,j;
cout <<"-----------------------------" <<endl;

for(i=1;i <=c;i++)
{for(j=1;j <=r;j++)

{cout <<get(i,j) <<" ";}

cout <<endl;}

cout <<"-----------------------------" <<endl;
}

void main()
{
RCV j[100];
int h,l,n;

cout<<"请输入矩阵的大小 行,列" <<endl;
cin>>h>>l;

cout <<"你要输入多少个元素?" <<endl;
cin>>n;

for(int i=1;i <=n;i++)
{cout <<"请输入第" <<i <<"元素所在的行,所在的列,元素的值" <<endl;
cin>>j[i].col>>j[i].row>>j[i].value;}

SMatrix M(j,h,l,n);
//M.print();
SMatrix A;
M.tran(A);
A.print();




}
天外小小 2009-05-17
  • 打赏
  • 举报
回复
我不想让他从0 开始 所以老有问题 怎么才能不从0开始呢?
liliangbao 2009-05-17
  • 打赏
  • 举报
回复
void cheng(SMatrix&x,SMatrix a,SMatrix b) 
{
int i,j,q,y,z;
x.c=b.r ;x.r=a.c ;x.num=a.num;
x.item=new RCV[a.num]; //这里有问题,因为x.item本来可能已经new空间了,所以在再次new之前应该将原来的释放~
//修改为:if(x.item != NULL){delete []x.item;}
for(i=1;i <=a.num;i++)
{ x.item[i].col=0;
x.item[i].row=0;
x.item[i].value=0;
}
}
ymll1 2009-05-17
  • 打赏
  • 举报
回复
大概看了一下,没看完,你这个写法看着太难受,
感觉下面这个有问题
SMatrix::SMatrix(RCV a[],int co,int ro,int n)
{
int i;
r=ro;c=co;num=n;
item=new RCV[num];

for(i=1;i <=num;i++)
item[i]=a[i];
}

c++中数组的索引是从0开始的,而不是1开始,你的item[0]没有初始化
后面的就没看了
zhan1094 2009-05-17
  • 打赏
  • 举报
回复
构造函数里的RCB 在new了之后没有delete
ietm没有new就不用delete了~
天外小小 2009-05-17
  • 打赏
  • 举报
回复
我也晕啊...
pathuang68 2009-05-17
  • 打赏
  • 举报
回复
提问不是很清楚...
天外小小 2009-05-17
  • 打赏
  • 举报
回复
这样写对吗?
天外小小 2009-05-17
  • 打赏
  • 举报
回复
struct RCV
{
int row,col;
int value;
};
class SMatrix
{

public:
SMatrix(){item=NULL;num=0;};
SMatrix(RCV a[],int co,int ro,int n); //co行 ro 列
~SMatrix(){delete[] item ;cout<<"sd";}
int get(int i,int j);
friend void cheng(SMatrix&x,SMatrix a,SMatrix b);
void print();
private:
RCV *item;
int r,c,num;
}
SMatrix::SMatrix(RCV a[],int co,int ro,int n)
{
int i;
r=ro;c=co;num=n;
item=new RCV[num];
for(i=1;i<=num;i++)
item[i]=a[i];

};void cheng(SMatrix&x,SMatrix a,SMatrix b)
{
int i,j,q,y,z;
x.c=b.r ;x.r=a.c ;x.num=a.num;
x.item=new RCV[a.num];
for(i=1;i<=a.num;i++)
{x.item[i].col=0;
x.item[i].row=0;
x.item[i].value=0;
}
adventurelw 2009-05-17
  • 打赏
  • 举报
回复
用new分配了动态空间,那么要找个地方delete了
对于类来说,析构函数是最好的选择,所以在析构函数中添加delete [] item;

同时,对于这种类,除非你非常确定不需要,否则最好是定义深度复制构造函数和深度赋值函数.
keaiting 2009-05-17
  • 打赏
  • 举报
回复
太长了,先写个小的含有你要提的问题的代码,再贴出来,肯定会有不少人回答的。
majun01 2009-05-17
  • 打赏
  • 举报
回复
CLASS X?

65,211

社区成员

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

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