我有下一个代码 我不知道如何解决多功能。 编译器给我发消息 不能将参数'a'声明为'Matriz'类型
我应该使用主要
中的代码消息无法将参数'a'声明为'Matriz'类型
enter code here
#include <iostream>
#include <iomanip>
using namespace std;
// Base
class IMatriz {
int **m;
int numRows;
int numColumns;
public:
IMatriz(){
numRows = 0;
numColumns = 0;
m = NULL;
}
IMatriz(int r, int c) {
numRows = r;
numColumns = c;
m = new int* [numRows];
for(int i=0; i < numRows; i++)
m[i] = new int [numColumns];
}
virtual void setSize(int r, int c) = 0;
virtual void setValue(int row, int col, int val) = 0;
virtual int getValue(int row, int col) = 0;
virtual int getNumRows() = 0;
virtual int getNumColumns() = 0;
virtual void mult(IMatriz a, IMatriz b) = 0;
virtual void print(void) = 0;
};
// Inherited
class Matriz : public IMatriz {
protected:
int **m;
int numRows;
int numColumns;
public:
Matriz()
: IMatriz()
{
}
Matriz(int r, int c)
: IMatriz(r, c)
{
numRows = r;
numColumns = c;
m = new int* [numRows];
for(int i=0; i < numRows; i++)
m[i] = new int [numColumns];
}
void setSize(int r, int c);
void setValue(int row, int col, int val);
int getValue(int row, int col);
int getNumRows();
int getNumColumns();
void mult(Matriz a, Matriz b);
void print();
};
// Functions
void Matriz::setSize(int r, int c) {
numRows = r;
numColumns = c;
}
void Matriz::setValue(int row, int col, int val) {
m[row][col] = val;
}
int Matriz::getValue(int row, int col) {
return m[row][col];
}
int Matriz::getNumRows() {
return numRows;
}
int Matriz::getNumColumns() {
return numColumns;
}
**void Matriz::mult(Matriz a, Matriz b) {**
// m.setSize( a.getNumRows(), b.getNumColumns() );
// for (int rows = 0; rows < numRows; rows ++)
// for (int cols = 0; cols < numColumns; cols ++)
// m[rows][cols] = 0;
// for (int rows = 0; rows < a.getNumRows(); rows ++)
// for (int cols = 0; cols < b.getNumColumns(); cols ++)
// for (int auxl = 0; auxl < a.getNumColumns(); auxl ++)
// m[rows][cols] += (a[rows][auxl] * b[auxl][cols]);
return;
}
void Matriz::print() {
for (int rows = 0; rows < numRows; rows ++)
{
for (int cols = 0; cols < numColumns; cols ++)
cout << m[rows][cols] << " ";
cout << endl;
}
}
// Principal
int main() {
Matriz m;
Matriz a(3, 2);
Matriz b(2, 3);
a.setValue(0,0,7);
a.setValue(0, 0, 7);
a.setValue(1, 0, 1);
a.setValue(2, 0, 8);
a.setValue(0, 1, 2);
a.setValue(1, 1, 5);
a.setValue(2, 1, 6);
b.setValue(0, 0, 2);
b.setValue(1, 0, 3);
b.setValue(0, 1, 5);
b.setValue(1, 1, 4);
b.setValue(0, 2, 8);
b.setValue(1, 2, 9);
a.print();
b.print();
// m.mult(a,b);
// m.print();
return 0;
}
答案 0 :(得分:0)
对您的代码进行了一些修改。请在下面找到固定代码 -
#include <iostream>
#include <iomanip>
using namespace std;
// Base
class IMatriz;
class IMatriz {
int **m;
int numRows;
int numColumns;
public:
IMatriz(){
numRows = 0;
numColumns = 0;
m = NULL;
}
IMatriz(int r, int c) {
numRows = r;
numColumns = c;
m = new int* [numRows];
for(int i=0; i < numRows; i++)
m[i] = new int [numColumns];
}
virtual void setSize(int r, int c) = 0;
virtual void setValue(int row, int col, int val) = 0;
virtual int getValue(int row, int col) = 0;
virtual int getNumRows() = 0;
virtual int getNumColumns() = 0;
virtual void mult(IMatriz &a, IMatriz &b) = 0;
virtual void print(void) = 0;
};
// Inherited
class Matriz : public IMatriz {
protected:
int **m;
int numRows;
int numColumns;
public:
Matriz()
: IMatriz()
{
}
Matriz(int r, int c)
: IMatriz(r, c)
{
numRows = r;
numColumns = c;
m = new int* [numRows];
for(int i=0; i < numRows; i++)
m[i] = new int [numColumns];
}
void setSize(int r, int c);
void setValue(int row, int col, int val);
int getValue(int row, int col);
int getNumRows();
int getNumColumns();
void mult(IMatriz &a, IMatriz &b);
void print();
};
// Functions
void Matriz::setSize(int r, int c) {
numRows = r;
numColumns = c;
}
void Matriz::setValue(int row, int col, int val) {
m[row][col] = val;
}
int Matriz::getValue(int row, int col) {
return m[row][col];
}
int Matriz::getNumRows() {
return numRows;
}
int Matriz::getNumColumns() {
return numColumns;
}
void Matriz::mult(IMatriz &a, IMatriz &b) {
// m.setSize( a.getNumRows(), b.getNumColumns() );
// for (int rows = 0; rows < numRows; rows ++)
// for (int cols = 0; cols < numColumns; cols ++)
// m[rows][cols] = 0;
// for (int rows = 0; rows < a.getNumRows(); rows ++)
// for (int cols = 0; cols < b.getNumColumns(); cols ++)
// for (int auxl = 0; auxl < a.getNumColumns(); auxl ++)
// m[rows][cols] += (a[rows][auxl] * b[auxl][cols]);
return;
}
void Matriz::print() {
for (int rows = 0; rows < numRows; rows ++)
{
for (int cols = 0; cols < numColumns; cols ++)
cout << m[rows][cols] << " ";
cout << endl;
}
}
// Principal
int main(int argc, const char * argv[]) {
Matriz m;
Matriz a(3, 2);
Matriz b(2, 3);
a.setValue(0,0,7);
a.setValue(0, 0, 7);
a.setValue(1, 0, 1);
a.setValue(2, 0, 8);
a.setValue(0, 1, 2);
a.setValue(1, 1, 5);
a.setValue(2, 1, 6);
b.setValue(0, 0, 2);
b.setValue(1, 0, 3);
b.setValue(0, 1, 5);
b.setValue(1, 1, 4);
b.setValue(0, 2, 8);
b.setValue(1, 2, 9);
a.print();
b.print();
// m.mult(a,b);
// m.print();
return 0;
}
这是我在xcode控制台上获得的输出 -
7 2
1 5
8 6
2 5 8
3 4 9
答案 1 :(得分:0)
您忘记了新的运营商(或Malloc)
Matriz a = new Matriz(3, 2);
答案 2 :(得分:0)
第一个问题是您无法实例化像IMatriz这样的抽象对象,您需要在以下函数声明中将其更改为IMatriz* a
或IMatriz& a
。
virtual void mult(IMatriz a, IMatriz b) = 0;
其次,Matriz类不会覆盖上面的纯虚函数,这使得Matriz类仍然是一个抽象类。因为在派生类中,您将其声明为void mult(Matriz a, Matriz b);
,与基类中的函数签名不同。
解决方案是从基类和派生类中将void mult(Matriz a, Matriz b);
更改为void mult(IMatriz* a, IMatriz* b)
,并使用指针调用它。