调用函数指针会导致错误

时间:2014-03-20 17:28:15

标签: c++

我正在尝试使用指针算法构建动态对象数组。但是,编译器在main.cpp

中的这一行返回以下错误
(*(lista+n))(id1,seleccion1,edad1,camiseta1);


error: no match for call to '(jugador) (int &, int & short, short int &, short int &)' 

欢迎任何建议,谢谢。

这是班级。

class jugador
{
private:

    int id;
    short seleccion;
    short edad;
    short camiseta;

public:
    jugador();
    jugador(int ID, short SELECCION, short EDAD, short CAMISETA);
    int obtener_id();
    short obtener_seleccion();
    short obtener_edad();
    short obtener_camiseta();
    void cambiar_id(int nueva_id);
    void cambiar_seleccion(short nueva_seleccion);
    void cambiar_edad(short nueva_edad);
    void cambiar_camiseta(short nueva_edad);
    void cambiar_todo(int nueva_ID, short nueva_SELECCION, short nueva_EDAD, short nueva_CAMISETA);
    void mostrar_jugador();
};

构造函数......

jugador::jugador()
{

    id=999999;
    seleccion=32;
    edad=99;
    camiseta=99;

}

jugador::jugador(int ID, short SELECCION, short EDAD, short CAMISETA)
{

    id=ID;
    seleccion=SELECCION;
    edad=EDAD;
    camiseta=CAMISETA;

}

Here is the full code

2 个答案:

答案 0 :(得分:1)

您是否有特殊原因未使用std::vector<jugador> 请检查此thread,了解将realloc替换为vector

您没有提供足够的信息,所以我可以从错误的外观中看出:

(*(lista+n))(id1,seleccion1,edad1,camiseta1);

这不是一个函数指针,它甚至没有指向一个函数。

您似乎试图通过移动jugador指针来构造lista数组。如果这是您想要做的,那么您可以进行后期初始化。

jugador * lista;  //< unitialized pointer
int n = 11; //< your number of players, lets suppose 11
lista = new jugador[11]; // now you have an array of jugadores
for(int i = 0; i != n; ++i)
{
  lista[i] = jugador(id1,seleccion1,edad1,camiseta1); 
}
// use your jugadores, let's suppose you want to use the tenth jugador
jugador *iterator = lista;
iterator+10;
use(*iterator); //*iterator variable holds your 10th jugador object
delete[] lista;

您在代码中使用realloc,建议您尝试使用newdelete。或者提供一个解释为什么使用realloc是一个不错的选择。

我在代码中注意到的另一件事是你没有释放你正在使用的内存。因此,您有内存泄漏。

如果您需要更多jugador,请使用std::copy来实现

// let's say in this point you need 20 jugador more
jugador * newlista = new jugador[n+20];
std::copy(lista, lista+11, newlista);
delete[] lista;  //you delete the old buffer
for(int i = 11; i != n+20; ++i)
{
  newlista[i] = jugador(id1,seleccion1,edad1,camiseta1); 
}
// and now newlista has your jugadores, you can even make a function that does that
delete[] newlista ; // delete your jugadores

答案 1 :(得分:1)

我完全同意Claudiordgz的回应。但是,如果要使用参数调用构造函数(不创建额外的副本),则需要创建一个指针数组而不是一个对象数组。我正在粘贴你的代码版本。但是,我仍然认为使用矢量的版本更安全,更优越。

代码:

int main()
{
    int id1;
    short seleccion1, edad1, camiseta1;
    jugador arreglo[5];
    int n = 0, i;
    char opcion = 's';
    jugador **lista=NULL;

    while (opcion == 's')
    {
        lista = new jugador*[n];
        cout<<"id: "<<endl;
        cin>>id1;
        cout<<"Seleccion: "<<endl;
        cin>>seleccion1;
        cout<<"Edad: "<<endl;
        cin>>edad1;
        cout<<"Camiseta: "<<endl;
        cin>>camiseta1;


        lista[n] = new jugador(id1,seleccion1,edad1,camiseta1);
        n++;
        cout << "Desea ingresar otro elemento? (s/n): ";
        cin >> opcion;
    }
    cout << "\nArreglo completo\n";
    for (i=0; i<n; i++)
    {
        lista[n].mostrar_jugador();
    }

    //deallocating memory

    for (int i=0; i<n; i++)
    {
            delete jugador[i];
    }

    delete [] jugador;

    return 0; 
}