继承的类问题

时间:2013-10-22 02:49:52

标签: c++ class inherited

我有下一个代码 我不知道如何解决多功能。 编译器给我发消息 不能将参数'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;
}

3 个答案:

答案 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* aIMatriz& 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),并使用指针调用它。