♣
destructor莫名其妙出错
哪位帮助看看,谢谢了!
//matrix.h
#ifndef matrix_h
#define matrix_h
#include <vector>
using namespace std;
template<class t>
class matrix
{
public:
matrix(unsigned numberofrows,unsigned numberofcolumns);
matrix(unsigned numberofrows,unsigned numberofcolumns,t initvalue);
~matrix();
vector<t>& operator[](unsigned index)const;
int numberrows()const;
int numbercolumns()const;
ostream& print(ostream&);
private:
vector<vector<t>*>rows;
};
template<class t>
matrix<t>::matrix(unsigned numberofrows,unsigned numberofcolumns)
:rows(numberofrows)
{
for(unsigned i=0;i<numberofrows;i++)
{
rows[i]=new vector<t>(numberofcolumns);
assert(rows[i]!=0);
}
}
template<class t>
matrix<t>::matrix(unsigned numberofrows,unsigned numberofcolunms,t init)
:rows(numberofrows)
{
for(unsigned i=0;i<numberofrows;i++)
{
rows[i]=new vector<t>(numberofcolunms,init);
assert(rows[i]!=0);
}
}
template<class t>
matrix<t>::~matrix()
{
//if this destructor is not exit,a link error will occurs
unsigned max=rows.length();
vector<t>* p;
for(int i=0;i<max;i++)
{
p=rows[i];
rows[i]=0;
delete p;
}
}
template<class t>
int matrix<t>::numbercolumns()const
{
return rows[0]->length();
}
template<class t>
int matrix<t>::numberrows()const
{
return rows.length();
}
template<class t>
ostream& matrix<t>::print(ostream& os)
{
for(int i=0;i<numberrows();i++)
os<<*(rows[i])<<endl;
return os;
}
template<class t>
ostream& operator<<(ostream& os,matrix<t> mat)
{
return mat.print(os);
}
#endif
//test.cpp
#include "vector.h"
#include "matrix.h"
void main()
{
matrix<int> mat0(5,8,0);
cout<<mat0<<endl;
}
· 网友精彩回答:
/*
你的程序没法通过编译
存放数组的数据没必要去使用指针,直接嵌套使用vector即可,这样的话也没有必要去写~matrix
你原本的~matrix是错误的,p=rows[i];rows[i]=0;delete p;
相当于delete (vector<t>*)0;没有任何效果
而且你应该知道,一旦涉及到指针,一般说来需要自己编写拷贝构造、赋予、析构
ostream& operator<<(ostream& os,matrix<t> mat)
会导致调用缺省拷贝构造,缺省的不是正确的
*/
#include <vector>
#include <iostream>
using namespace std;
template<class t>
class matrix
{
public:
matrix(size_t,size_t,const t& =t() );
const vector<t>& operator[](size_t) const;
int numberrows() const;
int numbercolumns() const;
t& value(size_t,size_t);
const t& value(size_t,size_t) const;
ostream& print(ostream&) const;
private:
vector< vector<t> > data;
};
template<class t>
matrix<t>::matrix(size_t row,size_t col,const t& def):data(row,vector<t>(col,def))
{}
template<class t>
int matrix<t>::numbercolumns() const
{
return data[0].size();
}
template<class t>
int matrix<t>::numberrows() const
{
return data.size();
}
template<class t>
t& matrix<t>::value(size_t r,size_t c)
{
return data[r][c];
}
template<class t>
const t& matrix<t>::value(size_t r,size_t c) const
{
return data[r][c];
}
template<class t>
ostream& matrix<t>::print(ostream& os) const
{
for(size_t i=0;i<numberrows();++i){
for(size_t j=0;j<numbercolumns();++j)
os<<data[i][j]<<\t;
os<<endl;
}
return os;
}
template<class t>
ostream& operator<<(ostream& os,const matrix<t>& mat)
{
return mat.print(os);
}
int main()
{
matrix<int> mat0(5,8,3);
mat0.value(1,2)=8;
cout<<mat0<<endl;
}
- 更多问题:
- · MSSQL2000 安装时出现的问题,急救
- · 新手提问.
- · 一个数据库同步的问题,感谢大家解答,比较有挑战性,必给分
- · 在用tc2.0进入图形方式的问题(百思不得其解)
- · 如何选择出指定行之间的纪录??大虾帮忙~
- · ACCESS与MYSQL数据库同步的问题!!必送分
- · SQL安装的时候出现这个问题,急救
- · ASP.NET web 应用程序如何调用其他程序
- · 如何用TImage的Canvas作一个点?
- · 求asp网站的打包加密解决方案
- · 创建视图时可否对某个表的某一项进行操作,如取其字符串的前三位?急急急
- · VB中如何往自己开发的自定义控件中加入属性、方法和事件?
- · excel
- · 最近缺钱花了
- · 求SQL?(最有效的方法)
- · Java 中显示图片 的问题...就是路径的问题?

