1

Mi programa tiene un problema al poder hacer un paso por referencia de arrays bidimensionales al constructor de la clase

 ||=== Build file: "no target" in "no project" (compiler: unknown) ===|
C:\Users\pc\Downloads\Matrices-Costructores.cpp|50|error: declaration of 'matriz1' as array of references|
C:\Users\pc\Downloads\Matrices-Costructores.cpp|50|error: expected ')' before ',' token|
C:\Users\pc\Downloads\Matrices-Costructores.cpp|50|error: prototype for 'Matriz::Matriz(...)' does not match any in class 'Matriz'|
C:\Users\pc\Downloads\Matrices-Costructores.cpp|6|error: candidates are: constexpr Matriz::Matriz(const Matriz&)|
C:\Users\pc\Downloads\Matrices-Costructores.cpp|8|error:                 Matriz::Matriz(int&, int&, int&, int&, int&, int&, int&)|
C:\Users\pc\Downloads\Matrices-Costructores.cpp|50|error: expected unqualified-id before 'int'|
||=== Build failed: 6 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

El código fuente:

#include<iostream>
#include<cstdlib>

using namespace std;


class Matriz {
public:
  Matriz (int &, int &, int &, int &,  int &,  int &,  int &);
  ~Matriz (){};
  int   A[10][10], B[10][10], C[10][10], op, f1, f2, f3, c1, c2, c3;
};

int main (){
  int seleccion, m1, m2, n1, n2, matriz1[10][10], matriz2[10][10];
  cout<<"Este Programa Realiza Operaciones Con Matrices"<<endl;
  cout<<"       MENU:"<<endl
     <<"1.- Suma"<<endl
    <<"2.- Multiplicacion"<<endl
   <<"Seleccion: ";     cin>>seleccion;

  cout<<"Dame el numero de columnas de la matriz 1: "; cin>>m1;
  cout<<"Dame el numero de filas de la matriz 1: "; cin>>n1;
  cout<<"Dame los datos: "<<endl;

  for(int i=0;i<m1;i++){
    for(int j=0;j<n1;j++){
      matriz1[i][j]=0;
      cout<<"["<<i+1<<"]"<<"["<<j+1<<"]"; cin>>matriz1[i][j];
    }}

  cout<<"Dame el numero de columnas de la matriz 2: "; cin>>m2;
  cout<<"Dame el numero de filas de la matriz 2: "; cin>>n2;
  cout<<"Dame los datos: "<<endl;

  for(int i=0;i<m2;i++){
    for(int j=0;j<n2;j++){
      matriz2[i][j]=0;
      cout<<"["<<i+1<<"]"<<"["<<j+1<<"]"; cin>>matriz1[i][j];
    }}

  Matriz ob (matriz1[10][10], matriz2[10][10], seleccion, m1, m2, n1, n2);
  cout<<"\n\nMatriz Resultante: \n";
  for(int i=0;i<m1;i++){
    for(int j=0;j<n1;j++){
      cout<<matriz1[i][j]<<"\t";
    }cout<<endl;

  }
}
Matriz::Matriz(int &matriz1 [10][10], int &matriz2[10][10], int &seleccion, int &m1,  int &m2,  int &n1,  int &n2)
{
  op=seleccion;
  c1=m1;        c2=m2;      f1=n1;      f2=n2;
  for(int i=0;i<c1;i++){
    for(int j=0;j<f1;j++){
      A[i][j] = matriz1[i][j];
    }}

  for(int i=0;i<c2;i++){
    for(int j=0;j<f3;j++){
      B[i][j] = matriz2[i][j];
    }}

  switch (op){

  case 1:
    if (c1==c2 && f1==f2){
      c3=c1; f3=f1;

      for (int i=0;i<c3;i++){
        for(int j=0;j<f3;j++){
          C[i][j]=0;
          C[i][j]=A[i][j]+B[i][j];

          c1 = c3 ; f1 = f3;
          for(int i=0;i<c3;i++){
            for(int j=0;j<f3;j++){
              C[i][j] = matriz1[i][j];
            }}

        }} }else {
      cout<<"\n\nRecuerda que para realizar una suma, las filas\ny las columnas deben ser iguales entre ambas\nmatrices.";
    }

  case 2:
    if(c1==f2){
      c3=c1; f3=f2;
      for (int i=0;i<c3;i++){
        for (int j=0;j<f3;j++){
          C[i][j]=0;
          for (int k=0;k<f1;k++){
            C[i][j]=C[i][j]+A[i][k]*B[k][j];
          }
        }
      }

      c1 = c3 ; f1 = f3;
      for(int i=0;i<c3;i++){
        for(int j=0;j<f3;j++){
          C[i][j] = matriz1[i][j];
        }}
    } else {cout<<"No se puede realizar la multiplicacion"<<endl;}
  }
}
eferion
  • 49,291
  • 5
  • 30
  • 72

2 Answers2

3

Esta declaración:

Matriz (int &, int &, int &, int &,  int &,  int &,  int &);

No es compatible con esta implementación:

Matriz::Matriz(int &matriz1 [10][10], int &matriz2[10][10], int &seleccion, int &m1,  int &m2,  int &n1,  int &n2)

Y el motivo son los dos primeros argumentos... simplemente no son iguales a los esperados.

Es facil de ver si trabajamos con variables que lo siguiente no va a compilar:

int matriz[10];
int variable = matriz; // ERROR: tipos incompatibles

Y lo mismo pasa con las referencias:

int matriz[10];
int& ref = matriz; // ERROR: tipos incompatibles

Dado que un array de tamaño fijo (que es lo que estás usando) es equivalente a un puntero no hay necesidad de pasar una referencia. La declaración del cosntructor debería parecerse más bien a esta:

Matriz (int [][10], int [][10], int &, int &,  int &,  int &,  int &);

Y la implementación a esta:

Matriz::Matriz(int matriz1 [][10], int matriz2[][10], int &seleccion, int &m1,  int &m2,  int &n1,  int &n2)

Nota que la primera dimensión la he omitido... es la única opcional al trabajar con este tipo de arrays... aunque si no te gusta siempre puedes especificar todas las dimensiones (aunque la primera será ignorada por el compilador):

Matriz::Matriz(int matriz1 [10][10], int matriz2[10][10], int &seleccion, int &m1,  int &m2,  int &n1,  int &n2)

En cualquier caso, si el resto de argumentos no va a ser modificado por el constructor, carece totalmente de sentido que sean referencias:

Matriz (int [][10], int [][10], int, int,  int,  int,  int);

Matriz::Matriz(int matriz1 [][10], int matriz2[][10], int seleccion, int m1,  int m2,  int n1,  int n2)

Por otro lado tu programa tiene otro error y es que la llamada al constructor no es correcta:

Matriz ob (matriz1[10][10], matriz2[10][10], seleccion, m1, m2, n1, n2);

Ya que debería ser así:

Matriz ob (matriz1, matriz2, seleccion, m1, m2, n1, n2);

Bonus

Si el destructor no va a tener un comportamiento específico lo mejor es no declararlo y dejar que sea el compilador el que se encargue de implementarlo:

class Matriz {
public:
  Matriz (int [][10], int [][10], int, int,  int,  int,  int);
  // ~Matriz (){};
  int   A[10][10], B[10][10], C[10][10], op, f1, f2, f3, c1, c2, c3;
};

Por otro lado, en los mensajes de error se aprecia estás compilando con, al menos, el estándar C++11. Si aun así sigues interesado en poner de forma explícita el destructor, has de saber que desde C++11 existe una nueva palabra reservada default que obliga al compilador a crear la implementación por defecto:

class Matriz {
public:
  Matriz (int [][10], int [][10], int, int,  int,  int,  int);
   ~Matriz () = default;
  int   A[10][10], B[10][10], C[10][10], op, f1, f2, f3, c1, c2, c3;
};
eferion
  • 49,291
  • 5
  • 30
  • 72
2
prototype for 'Matriz::Matriz(...)' does not match any in class 'Matriz'

Este error te está diciendo que para construir Matriz ninguno de los constructores existentes coinciden con los argumentos que le has proveído. Y es normal porque declaras el constructor de Matriz para que reciba siete referencias a entero:

Matriz (int &, int &, int &, int &,  int &,  int &,  int &);

Y lo defines para que reciba dos formaciones1 bidimensionales de referencias y cinco referencias a entero:

Matriz(int &matriz1 [10][10], int &matriz2[10][10], int &seleccion, int &m1,  int &m2,  int &n1,  int &n2)

declaration of 'matriz1' as array of references

Estás declarando formaciones de referencias no referencias a formaciones. En C++ es obligatorio que las referencias referencien a algo (echa un vistazo a esta respuesta) y por ello el lenguaje prohíbe las formaciones de referencias, ya que podrían dar lugar a referencias que no apuntasen a nada.

La manera de declarar una referencia a formación es la siguiente:

tipo (&nombre)[rango1][rango2][...];

Los paréntesis rodeando el nombre son lo que distinguirá una formación de referencias de una referencia a formación, si quieres una referencia a una formación de 10×10 enteros ésta es la manera de declararla:

int (&matriz1)[10][10];

  1. También conocida como arreglo, o en inglés: array.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82