gpt4 book ai didi

c++ - 使用重载流插入运算符输出对象的双指针成员?

转载 作者:行者123 更新时间:2023-11-30 05:29:03 24 4
gpt4 key购买 nike

我目前正在实现一个类,该类可以使用带有双指针(double 类型)的动态数组表示矩阵,为矩阵算术 重载*/-/+ 运算符 &用于输出矩阵的重载流插入运算符

我的项目要求用户将一系列由空格分隔的输入输入到一个字符串中,字符串中的项数等于列数,字符串输入数等于行数。我已经能够成功地写出我的类函数定义,但是当我编译和运行我的代码时,一旦程序到达重载插入运算符调用,它只打印一个内存地址而不是数组中的每个值,无论有多少我尝试行或列。

我的类(class)定义:

class clMatrix {
private:
int rows, cols ;
double **arr ;
public:
clMatrix() ;
~clMatrix() ;
void userInput(char matrixId, int &rowN, int &colN) ;
friend ostream &operator<<(ostream& os, const clMatrix*&) ;
friend clMatrix &operator+(const clMatrix&, const clMatrix&) ;
friend clMatrix &operator-(const clMatrix&, const clMatrix&) ;
friend clMatrix &operator*(const clMatrix&, const clMatrix&) ;
} ;

我的类函数定义(特别是输入和输出,因为我没有测试的算术运算符,因为我没有输出要测试)和 main:

输出函数:

ostream& operator<<(ostream& os, const clMatrix *&printMatrix) {
for(int i = 0; i < printMatrix->rows; ++i) {
os << "\nRow " << i+1 << ": " ;
for(int j = 0; j < printMatrix->cols; ++j) {
os << printMatrix->arr[i][j] << " " ;
}
}
os << endl ;
return os ;
}

输入函数:

void clMatrix::userInput(char matrixId, int &rowN, int &colN) {
string in ;
int idx, rowLen, colLen ;
double rowarr[50] ;
bool firstRow = 1 ;
colLen = 0 ;
rowLen = 0 ;
idx = 0 ;
cout << "Matrix: " << "'" << matrixId << "'" << endl ;
cout << "Enter row 1: " ;
getline(cin,in) ;
while(in != "") {
++rowLen ;
stringstream iss(initial) ;
while(iss >> rowarr[idx]) {
++idx ;
}
if(firstRow) {
colLen = idx ;
firstRow = 0 ;
}
cout << "Enter row " << rowLen + 1 << ": " ;
getline(cin,in) ;
}
idx = 0 ;
rows = rowLen ;
cols = colLen ;

arr = new double*[rows] ;
for(int i = 0; i < rows; ++i) {
arr[i] = new double[cols] ;
}
idx = 0 ;
for(int i = 0; i < rows; ++i) {
for(int j = 0; j < cols; ++j) {
arr[i][j] = rowarr[idx] ;
++idx ;
}
}
}

主要功能:

#ifndef HEADER_H
#define HEADER_H
#include "header.h"
int main() {
clMatrix *aMatrix ;
clMatrix *bMatrix ;
aMatrix = new clMatrix ;
bMatrix = new clMatrix ;
char matrixId ;
int rowsA, rowsB, colsA, colsB ;

matrixId = 'A' ;
cout << "Matrix A input:\n" ;
aMatrix->userInput(matrixId,rowsA,colsA) ;

matrixId = 'B' ;
cout << "Matrix B input:\n" ;
bMatrix->userInput(matrixId,rowsB,colsB) ;

cout << "Matrix A output:\n" ;
cout << aMatrix ;
cout << "Matrix B output:\n" ;
cout << bMatrix ;

delete aMatrix ;
delete bMatrix ;
return 0 ;
}

当我运行程序时,我为每个矩阵获得一个堆分配的单个地址,我认为它们相差 32 位? (我最近的运行:0x1dbcc20 和 0x1dbcc40)。这是否意味着只有我的两个整数成员变量被分配为每个 16 位?如果是这样,是不是我的内存分配不当?我还尝试了取消引用 double 类型双指针的几乎所有可能的等级,但无济于事。另外,奇怪的是:

os << "\nRow " << i+1 << ": " ;

从我的流插入重载函数中,尽管它打算为每一行打印,但它从不打印到控制台,但程序跳过它进入内部 for 循环并打印那个该死的地址。我根本不明白。

我已经用尽所有选项(过去 5 小时一直在 GDB/valgrind 中编辑/重新编译/运行和调试),几乎用尽了我能找到的与我的问题相关的所有资源,所以现在凌晨 2 点 45 分, sleep 严重不足的我求助于你们,SO 的勇敢灵魂。非常感谢任何帮助,谢谢! (很抱歉,如果这不连贯且难以理解,我很累!)

最佳答案

您的流出运算符有第二个形式参数 const clMatrix *&printMatrix .这是指向 clMatrix 的 const 指针的左值引用.您使用指向 clMatrix 的左值非常量指针来调用它,它不会绑定(bind)到引用(如果绑定(bind)了,您可以使用它来违反 const 安全)。

因此,唯一可用的重载是 ostream成员函数 operator<<(const void* value) ,打印原始指针值。

以下任一签名都可以使用:

operator<<(ostream&, const clMatrix*const &)
operator<<(ostream&, const clMatrix*)

但采用 clMatrix 会更加地道参数直接通过 const 引用:

operator<<(ostream&, const clMatrix&)

关于c++ - 使用重载流插入运算符输出对象的双指针成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36569787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com