C++ Expresión debe tener puntero-a-tipo de objeto

Queridos stackoverflow útil de la comunidad,

Este es mi primer programa usando un puntero a una estructura, y a pesar de que mucha de la investigación, yo no era capaz de encontrar lo que estaba buscando, pero por favor, perdóname si esto ya ha sido respondido.

Tengo un proyecto para la escuela donde tengo que definir estructuras de uso de los punteros de la matriz para almacenar los datos. En este bucle, me sale el error «Expresión debe tener puntero-a-tipo de objeto»

for (int i = 0; i < nbClerk; i++)
            {
                cout<<"Number of hours: ";
                cin>>c_info->hoursWorked[i];
            }
            break;

aquí está el código completo. muchas gracias por su ayuda

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

//structure defining Employee
struct Employee
{
    int hoursWorked;
    int hourRate;
    double overtime;
    string name;
    int empID;
};

//Function collecting and calculating info
void employeeInfo(int nbOperator, int nbClerk){

    char classOfEmployee;

    Employee *c_info;
    c_info = new (nothrow) Employee[nbClerk];

    Employee *o_info;
    o_info = new (nothrow) Employee[nbOperator];

    cout<<"Select the class of employee (C=Clerk, O=Operator)";
    cin>>classOfEmployee;

    switch (tolower(classOfEmployee))
    {
    case 'c': 
        for (int i = 0; i < nbClerk; i++)
        {
            cout<<"Number of hours: ";
            cin>>c_info->hoursWorked[i];
        }
        break;
    }
}

int main(){
    int nb1,nb2;
    cout<<"Nb Employee and nb of nb of operator: ";
    cin>>nb1>>nb2;
    nbEmployee(nb1, nb2);
    system("pause");
}
  • Tenga en cuenta que el programa tiene una pérdida de memoria: Se distinguen dos matrices con el new operador, pero no usa la delete operador para liberar la memoria de nuevo. Insertar delete[] c_info; delete[] o_info; cuando no la necesito.
InformationsquelleAutor Larry | 2013-04-18

2 Kommentare

  1. 6

    Que probablemente significaba:

    c_info[i].hoursWorked;

    desde c_info es una matriz, haciendo c_info[i] vas a tener acceso a la i-th instancia (objeto) de Employee clase en c_info de la matriz y, a continuación, obtener hoursWorked a través de . operador.

    Ahora usted puede ver claramente que su variante, simplemente no tiene sentido, como hoursWorked es sólo un tipo integral y no una matriz, y por lo tanto no se puede aplicar [] operador a ella.

    • Pero c_info es un puntero a un solo Employee, instanciado con una new sólo un par de líneas antes. Así que va a compilar, pero yo no creo que sea la respuesta correcta, sin embargo.
    • Ah, derecho que son. +1.
    • Muchas gracias a los dos. Que fue rápido 🙂 todo funciona bien !!
  2. 2

    c_info es un puntero a un Empleado. Usted puede asignar un único objeto asignado a un puntero o, en su caso, varios (new con la sintaxis de array). Por lo que apunta a una matriz de los Empleados.

    Se eliminan las referencias que puntero. Ya que apunta a una matriz de (múltiples) de los Empleados, también apunta a la primera entrada. A continuación, tener acceso a un número entero miembro de la variable, que es todavía posible. Pero, a continuación, intenta utilizar la matriz de operador de subíndice ([]) en un valor entero, que no es posible.

    Que probablemente significaba para acceder a la variable de miembro de la i-ésima de su asignados matriz. Usted tiene que activar esta a su alrededor: la Primera utilización de la matriz de operador de subíndice, luego de acceso de los estados en que el Empleado en particular.

    c_info[i] en los niveles más bajos palabras significa: llevar el puntero c_info, agregar i veces el tamaño de el tipo que los puntos a (para que apunte a la i-ésima) y eliminar esa dirección. Esto significa, que c_info[i] en realidad es el Empleado en la i-th índice (pero no es un puntero).

    A continuación, desea tener acceso a un miembro de ese empleado. Si aún así fue un puntero, tendría que utilizar el operador flecha, pero ya que usted usó la matriz de operador de subíndice ([i]), ya se han eliminan las referencias de ella, el punto de operador es la correcta:

    cin >> c_info[i].hoursWorked;
    • Oh ya entiendo, muy bien explicado. Muchas gracias.
    • Intente utilizar dinámico de estructuras de datos como std::vector, a menos que usted tiene para su uso en crudo, punteros / matrices debido a la asignación de la escuela de requisitos. En el alto nivel C++ mundo es más o menos obsoleta (algunas veces todavía se utiliza). std::vector es mucho más conveniente, también en cuanto a problemas de gestión de memoria (no se puede simplemente olvidarse de liberar la memoria).
    • Gracias por la sugerencia, pero yo, de hecho, tiene el uso de punteros para esta tarea, pero trataremos de hacer un vector versión en mi propio seguro. Gracias !
    • Y usted podría también de la mano y sugieren su profesor para el uso de vectores también 😉 (a menos que el puntero de la versión de asignación era sólo un bajo nivel de ejercicio, lo que también es importante)
    • era un bajo nivel de prueba. se trata de una introducción a la programación de la clase. comenzamos a ver vector próximo semestre 🙂

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea