- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在实现一个类,该类可以使用带有双指针(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/
Or 运算符 对两个表达式进行逻辑“或”运算。 result = expression1 Or expression2 参数 result 任意数值变量。 expression1 任意
Not 运算符 对表达式执行逻辑非运算。 result = Not expression 参数 result 任意数值变量。 expression 任意表达式。 说明 下表显示如何
Is 运算符 比较两个对象引用变量。 result = object1 Is object2 参数 result 任意数值变量。 object1 任意对象名。 object2 任意
\ 运算符 两个数相除并返回以整数形式表示的结果。 result = number1\number2 参数 result 任意数值变量。 number1 任意数值表达式。 numbe
And 运算符 对两个表达式进行逻辑“与”运算。 result = expression1 And expression2 参数 result 任意数值变量。 expression1
运算符(+) 计算两个数之和。 result = expression1 + expression2 参数 result 任意数值变量。 expression1 任意表达式。 exp
我对此感到困惑snippet : var n1 = 5-"4"; var n2 = 5+"4"; alert(n1); alert(n2); 我知道 n1 是 1。那是因为减号运算符会将字符串“4”转
我想我会得到 12,而不是 7。 w++,那么w就是4,也就是100,而w++, w 将是 8,1000;所以 w++|z++ 将是 100|1000 = 1100 将是 12。 我怎么了? int
Xor 运算符 对两个表达式进行逻辑“异或”运算。 result = expression1 Xor expression2 参数 result 任意数值变量。 expression1
Mod 运算符 两个数值相除并返回其余数。 result = number1 Mod number2 参数 result 任意数值变量。 number1 任意数值表达式。 numbe
Imp 运算符 对两个表达式进行逻辑蕴涵运算。 result = expression1 Imp expression2 参数 result 任意数值变量。 expression1 任
Eqv 运算符 执行两个表达式的逻辑等价运算。 result = expression1 Eqv expression2 参数 result 任意数值变量。 expression1 任
我有一个运算符重载的简单数学 vector 类。我想为我的运算符(operator)获取一些计时结果。我可以通过计时以下代码轻松计时我的 +=、-=、*= 和/=: Vector sum; for(s
我是用户定义比较运算符的新手。我正在读一本书,其中提到了以下示例: struct P { int x, y; bool operator、运算符<等),我们
在 SQL 的维基百科页面上,有一些关于 SQL 中 bool 逻辑的真值表。 [1] 维基百科页面似乎来源于 SQL:2003 标准。 等号运算符 (=) 的真值表与 SQL:2003 草案中的 I
我遇到了一个奇怪的 C++ 运算符。 http://www.terralib.org/html/v410/classoracle_1_1occi_1_1_number.html#a0f2780081f
我正在阅读关于 SO 和 answers 中的一个问题,它被提到为: If no unambiguous matching deallocation function can be found, pr
我偶然发现了这个解决方案,但我无法理解其中到底发生了什么。谁能解释一下! 据我了解,它试图通过计算一半的单元格然后将其加倍来计算 a*b 网格中的单元格数量。但是我无法理解递归调用。 请不要建议其他解
Go的基本类型 布尔类型bool 长度:1字节 取值:布尔类型的取值只能是true或者false,不能用数字来表示 整型 通用整型 int / uint(有符号 / 无符号,下面也类似) 长度:根据运
在本教程中,您将学习JavaScript中可用的不同运算符,以及在示例的帮助下如何使用它们。 什么是运算符? 在JavaScript中,运算符是一种特殊符号,用于对运算数(值和变量)执行操作。例如,
我是一名优秀的程序员,十分优秀!