我在返回指向对象数组的指针时遇到问题。输入所有信息并顺利进行后,当我尝试仅使用指针打印对象数组时,第一个记录将正确打印,下一个记录将数字弄乱。我认为问题出在招募公司员工的回报和分配上。现在,我认为get_employees()函数仅返回第一条记录。我在这方面是否错了,或者它可能正在将新的指针分配给创建的数据库。我不知道是什么问题。我知道数组的名称是指向第一条记录的指针,我只是不知道如何不输?其他记录。

//#include "stdafx.h" // Used only on Windows machines
#include <iostream>
#include <cstdlib>
#include <new>
#include <cstring>
using namespace std;

//**********************************************************************
//*                         Symbolic Constants                         *
//**********************************************************************

#define MAX_NAME_LENGTH    80      // Maximum company name length
#define COMPANY_ALLOC_ERR  1       // Company name memory allocation err
#define NAME_ALLOC_ERR     2       // Name allocation error
#define EMPLOYEE_ALLOC_ERR 3       // Employee allocation error

//**********************************************************************
//*                          Program Structure                         *
//**********************************************************************
//
struct company_information
{
   char  *p_company_name;
   int   bonus_year,
         number_of_employees;
   float bonus_amount;
};

//**********************************************************************
//*                            Program Class                           *
//**********************************************************************
//
class company_employee_bonus_record
{
   int   employee_id,
         service_years,
         year_hired;
   float bonus;
public:

   // Set the member variables
   void  set_id           (int i)   {employee_id   = i;}
   void  set_service_years(int s)   {service_years = s;}
   void  set_year_hired   (int y)   {year_hired    = y;}
   void  set_bonus        (float b) {bonus         = b;}

   // Get the member variables
   int   get_id           ()        {return employee_id;}
   int   get_service_years()        {return service_years;}
   int   get_year_hired   ()        {return year_hired;}
   float get_bonus        ()        {return bonus;}

   ~company_employee_bonus_record() {cout << "Destructor executing";}
};

//**********************************************************************
//*                        Function prototypes                         *
//**********************************************************************
company_information get_company_information();
company_employee_bonus_record get_employees(company_information user_company);
void print_employee_database(company_employee_bonus_record *p_employee_db, int number_emp);

//**********************************************************************
//*                           Main function                            *
//**********************************************************************
int main()
{
   company_employee_bonus_record *p_user_employee_db;
   company_information user_company;


   user_company = get_company_information();

   cout << "\nCompany name: "        << user_company.p_company_name;
   cout << "\nYear of te bonuses: "  << user_company.bonus_year;
   cout << "\nNumber of employees: " << user_company.number_of_employees;
   cout << "\nBonus per year: "      << user_company.bonus_amount;

   // This is the part that is confusing me up.

   *p_user_employee_db = get_employees(user_company);

   print_employee_database(p_user_employee_db, user_company.number_of_employees);

   return 0;
}


//**********************************************************************
//*                      Get company information                       *
//**********************************************************************
company_information get_company_information()
{
   company_information *p_company_info;
   char company_name[MAX_NAME_LENGTH + 1];

   try {
      p_company_info = new company_information;
   } catch (bad_alloc xa) {
      exit(COMPANY_ALLOC_ERR);
   }

   cout << "\nEnter the name of your company here (no spaces): ";
   cin  >> company_name;

   try {
      p_company_info->p_company_name = new char[strlen(company_name) + 1];
   } catch (bad_alloc xa) {
      exit(NAME_ALLOC_ERR);
   }

   strcpy(p_company_info->p_company_name, company_name);
   cout << "Enter your number of employees (1 or more): ";
   cin  >> p_company_info->number_of_employees;
   cout << "Enter the year in which the bonuses are given (YYYY): ";
   cin  >> p_company_info->bonus_year;
   cout << "Give the yearly bonus amount per employee (in dollars): ";
   cin  >> p_company_info->bonus_amount;

   return *p_company_info;
}

company_employee_bonus_record get_employees(company_information user_company)
{
   int service_years, employee_number;
   company_employee_bonus_record *p_employee_db,
                                 *p_next_employee;
   try {
      p_employee_db = new company_employee_bonus_record[user_company.number_of_employees];
   } catch (bad_alloc xa) {
      exit(EMPLOYEE_ALLOC_ERR);
   }

   employee_number = 1;
   p_next_employee = p_employee_db;

   do {
      cout << "\nPlease enter the number of years for employee" << employee_number
            << "(0 if emp doesnt exist): ";
      do {
         cin >> service_years;
         if (service_years < 0)
         {
            cout << "Invalid year";
         }
      } while (service_years < 0);
      if(service_years > 0)
      {
         p_next_employee->set_id(employee_number);
         p_next_employee->set_service_years(service_years);
         p_next_employee->set_year_hired(user_company.bonus_year - service_years);
         p_next_employee->set_bonus(user_company.bonus_amount * service_years);

         employee_number++;
         p_next_employee++;
      }
      else{
         employee_number++;
      }
   } while (p_next_employee - p_employee_db < user_company.number_of_employees);

   return *p_employee_db;
}

void print_employee_database(company_employee_bonus_record *p_employee_db, int number_emp)
{
   company_employee_bonus_record *p_next_employee;

   p_next_employee = p_employee_db;

   cout << "\nUNSORTED LIST";

   //In this while loop, the first record is sorted fine, but the next ones are all jumbled numbers.

   while(p_next_employee - p_employee_db < number_emp)
   {
      cout << "\n" << p_next_employee->get_id() << "     "
      << p_next_employee->get_service_years() << "   "
      << p_next_employee->get_year_hired() << "    "
      << p_next_employee->get_bonus();
      p_next_employee++;
   }
}

最佳答案

有两种解决问题的方法。


返回指向存储在数据库中的对象的指针。
从数据库中存储的对象列表中返回一个对象。


为了简化此答案,让我们使用简单的struct

struct A
{
};

A database[DATABASE_SIZE]; // Let's assume DATABASE_SIZE is defined somewhere.

A* getPointerFromDataBase()
{
   // Return the 101-st object from the database
   return database+100;
}

A& getObjectFromDataBase()
{
  // Return the 101-st object from the database
  return database[100];
}

int main()
{
   // Get a pointer from the database.
   A* aPtr = getPointeFromDataBase();

   // Get an object from the database.
   A a = getObjectFromDataBase();

   // This is no valid. aPtr2 does not point to any valid address.
   // It cannot be dereferenced to hold an object.
   A* aPtr2;
   *aPtr2 = getObjectFromDataBase();
}

关于c++ - 返回指向对象数组的指针并将其分配给指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22799855/

10-11 22:48
查看更多