我有下面的C++代码,它定义了一个Vector类和一个Matrix类。我想使用诸如"m[I][j]"之类的索引来访问矩阵中的元素。
但是编译器在这一行引发了一个错误
std::cout << data[i][j];
在以下代码中:
#include <iostream>
template<class T>
class Vector{
public:
Vector(int length){
size = length;
data = new T[size];
}
~Vector(){
delete [] data;
}
void set_value(T value){
for (int i = 0; i< size; i++){
data[i] = value;
}
}
void print(){
for (int i = 0; i < size; i++){
std::cout << data[i] << std::endl;
}
}
T operator[](int index){
return data[index];
}
private:
T * data;
int size;
};
template<class T>
class Matrix{
public:
Matrix(int height, int width) {
this -> height = height;
this -> width = width;
Vector<T> * * data = new Vector<T> * [height];
for (int i = 0; i < height; i++){
data[i] = new Vector<T>(width);
}
}
~Matrix(){
for (int i = 0; i <= width; i++){
delete [] data[i];
}
delete [] data;
}
void set_value(T value){
for (int i = 0; i <= height; i++){
data[i] -> set_value(value);
}
}
void print(){
for (int i = 0; i < height; i++){
for (int j = 0; j< width; j++){
std::cout << data[i][j];
}
std::cout << std::endl;
}
}
Vector<T> * operator[](int index){
return data[index];
}
private:
Vector<T> * * data;
int height;
int width;
};
int main(){
Vector<float> v = Vector<float>(10);
v.set_value(1.0);
std::cout << v[1] << std::endl;
Matrix<float> m = Matrix<float>(10, 10);
m.set_value(1.0);
m.print();
std::cout << m[5][5] << std::endl;
}
我搜索了一下,但没有直接的答案。乐于助人的人都非常感激。提前谢谢。
具体错误消息如下:
无法将"std::ostream"lvalue绑定到"std::basic_stream&;'
我根据下面的友好建议修改了代码
它现在正在编译,但在stdout中打印"1"后运行它会出现"分段错误">
#include <iostream>
template<class T>
class Vector{
public:
Vector(int length){
size = length;
data = new T[size];
}
~Vector(){
delete [] data;
}
void set_value(T value){
for (int i = 0; i< size; i++){
data[i] = value;
}
}
void print(){
for (int i = 0; i < size; i++){
std::cout << data[i] << std::endl;
}
}
T operator[](int index){
return data[index];
}
private:
T * data;
int size;
};
template<class T>
class Matrix{
public:
Matrix(int height, int width) {
this -> height = height;
this -> width = width;
Vector<T> * * data = new Vector<T> * [height];
for (int i = 0; i < height; i++){
data[i] = new Vector<T>(width);
}
}
~Matrix(){
for (int i = 0; i <= width; i++){
delete [] data[i];
}
delete [] data;
}
void set_value(T value){
for (int i = 0; i <= height; i++){
data[i] -> set_value(value);
}
}
void print(){
for (int i = 0; i < height; i++){
for (int j = 0; j< width; j++){
std::cout << (*this)[i][j];
}
std::cout << std::endl;
}
}
Vector<T>& operator[](int index){
return *(data[index]);
}
private:
Vector<T> * * data;
int height;
int width;
};
int main(){
Vector<float> v = Vector<float>(10);
v.set_value(1.0);
std::cout << v[1] << std::endl;
Matrix<float> m = Matrix<float>(10, 10);
m.set_value(1.0);
m.print();
std::cout << m[5][5] << std::endl;
}
更新
在用指针等修复了所有错误之后,一个似乎有效的解决方案,感谢所有的帮助
#include <iostream>
template<class T>
class Vector{
public:
Vector(int length){
size = length;
data = new T[size];
}
~Vector(){
delete [] data;
}
void set_value(T value){
for (int i = 0; i< size; i++){
data[i] = value;
}
}
void print(){
for (int i = 0; i < size; i++){
std::cout << data[i] << std::endl;
}
}
T operator[](int index){
return data[index];
}
private:
T * data;
int size;
};
template<class T>
class Matrix{
public:
Matrix(int height, int width) {
this -> height = height;
this -> width = width;
data = new Vector<T> * [height];
for (int i = 0; i < height; i++){
data[i] = new Vector<T>(width);
}
}
~Matrix(){
for (int i = 0; i <= width; i++){
delete data[i];
}
delete [] data;
}
void set_value(T value){
for (int i = 0; i < height; i++){
data[i] -> set_value(value);
}
}
void print(){
for (int i = 0; i < height; i++){
for (int j = 0; j< width; j++){
std::cout << (*this)[i][j];
}
std::cout << std::endl;
}
}
Vector<T>& operator[](int index){
return *(data[index]);
}
private:
Vector<T> * * data;
int height;
int width;
};
int main(){
Matrix<float> m = Matrix<float>(10, 5);
m.set_value(1.0);
m.print();
}
更改Matrix::operator[](int index)
,使其返回对Vector
的引用,而不是指针。否则,矩阵语法将不起作用。
编辑:在行中:
Vector<T> * * data = new Vector<T> * [height];
您正在创建一个新的本地变量data
,它隐藏了您的成员变量data
。更改为:
data = new Vector<T> * [height];
Matrix(int height, int width) {
this -> height = height;
this -> width = width;
Vector<T> * * data = new Vector<T> * [height];
for (int i = 0; i < height; i++){
data[i] = new Vector<T>(width);
}
}
应该是
Matrix(int height, int width) {
this -> height = height;
this -> width = width;
data = new Vector<T> * [height];
for (int i = 0; i < height; i++){
data[i] = new Vector<T>(width);
}
}
您的版本将data
声明为局部变量,并隐藏具有相同名称的类级变量。这是一个常见的新手错误。
首先,您的构造函数实现错误。你做
Vector<T> * * data = new Vector<T> * [height];
这将初始化局部变量data
,并将new[]
的结果存储在该局部指针中。您需要将指针存储在类成员data
中,而不是本地变量中。删除局部变量声明,改为使用成员data
。
其次,矩阵类的析构函数中存在错误。在析构函数中,delete [] data
是正确的,但循环中的delete [] data[i]
是完全不正确的。在循环中,应该使用delete
,而不是delete []
。
问题已经解决(我已经测试过了(。它在标准输出中输出
11111
11111
11111
11111
11111
11111
11111
11111
11111
11111
似乎是正确的做法。