Problema con una lista simplemente enlazada en C++

Iniciado por Mike_EDD, 4 Septiembre 2017, 22:14 PM

0 Miembros y 1 Visitante están viendo este tema.

Mike_EDD

Buenas, resulta que tengo un problema con una lista simplemente enlazada en C++, me aparece el siguiente error:

||=== Build: Debug in Activity_3 (compiler: GNU GCC Compiler) ===|
(en el main)||In function 'int main()':|
(en el main)|19|error: no matching function for call to 'Exitos::insertData(int, int&)'|
(en el main)|19|note: candidate is:|
(la lista.h)|46|note: void Exitos::insertData(int&, const int&)|
(la lista.h)|46|note:   no known conversion for argument 1 from 'int' to 'int&'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

aqui dejo el codigo:

//aqui esta el archivo de cabecera

#ifndef (nombre del archivo.h)_H_INCLUDED
#define (nombre del archivo.h)_H_INCLUDED

#include<exception> //esto lo podemos omitir
#include<iostream>

class Exitos{
private:
    int data[50];
    int last;

public:

    void inicialize();
    bool isEmpty();
    bool isFull();

    void insertData(int&, const int&);
    void deleteData(const int&);

    int getFirstPos();
    int getLastPos();
    int getPrevPos(const int&);
    int getNextPos(const int&);

    int finData();
    int retrieve(const int&);

};

void Exitos::inicialize()
{
    last = -1;
}

bool Exitos::isEmpty()
{
    return last == -1;
}

bool Exitos::isFull()
{
    return last == 49;
}

void Exitos::insertData(int& p, const int& e)
{
    if(isFull()){
        //aqui va una excepcion, la podemos omitir
    }
    if(p < -1 || p > last){
        //aqui va una excepcion, la podemos omitir
    }
    int i = last + 1;
    while(i > p){
        data[i+1] = data;
        i--;
    }
    data[p+1] = e;
    last++;
}

void Exitos::deleteData(const int& p)
{
    if(isFull()){
        //aqui va una excepcion, la podemos omitir
    }
    if(p < -1 || p > last){
       //aqui va una excepcion, la podemos omitir
    }
    int i = p;
    while(i < last){
        data = data[i+1];
        i++;
    }
    last--;
}

int Exitos::getFirstPos()
{
    if(isEmpty()){
        //aqui va una excepcion, la podemos omitir
    }
    return -1;
}

int Exitos::getLastPos()
{
    return last;
}

int Exitos::getPrevPos(const int& p)
{
    if(isEmpty() or p < 0 or p > last){
        return -1;
    }
    return p-1;
}

int Exitos::getNextPos(const int& p)
{
    if(isEmpty() or p < 0 or p > last - 1){
        return -1;
    }
    return p+1;
}

int Exitos::finData()
{
    //aqui va otra cosa pero lo podemos omitir
    return 0;
}

int Exitos::retrieve(const int& p)
{
    if(p < 0 or p > last){
        //aqui va una excepcion, la podemos omitir
    }
    return data[p];
}

#endif

//aqui esta el archivo .cpp

#include "(el archivo).h"

using namespace std; // iostream lo omito porque ya esta en la cabecera que cree

int main()
{
    Exitos uno;

    int mydatos, i;

    uno.inicialize();

    for(i=0; i<20; i++){
        mydatos = i;
        cout << "Insertando: " << mydatos << endl;

        uno.insertData(uno.getFirstPos(),mydatos);
    }
    cout << endl << endl << endl;
}

El error me da cuando quiero agregar la posición del elemento en insertData, estuve buscando en decenas de paginas y libros, pero todos los autores utilizan struct, en ninguna trabajan con programacion orientada a objetos, el unico error que me da es en el main, gracias por ayudar.

ivancea96

getFirstpos retorna un int. Como no lo guardas en ninguna variable, digamos que es un int ""volatil"" que va a desaparecer.
void Exitos::insertData(int& p, const int& e)
Pides una referencia a int, "int&". Requiere que se le pase un valor "localizado en memoria", como puede ser una variable. Pasar directamente el retorno de la función no sirve.

La pregunta aquí es: ¿Por qué necesitas que sea "int&"? Probablemente te sirva si pones "int" asecas.