我在返回指向对象数组的指针时遇到问题。输入所有信息并顺利进行后,当我尝试仅使用指针打印对象数组时,第一个记录将正确打印,下一个记录将数字弄乱。我认为问题出在招募公司员工的回报和分配上。现在,我认为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/