我正在创建一个enqueue程序,必须将客户排入队列。 但是,在排入队列后,我无法打印出正确的信息。 我创建了2个类Customer和CustomerQueue。
这是客户类的功能:
Customer::Customer (char *name, int age)
{
this -> name = name;
this -> age = age;
this -> sex = 'S';
}
void Customer::printCustomer () const
{
if (age >= 65)
{
cout << "Senior " << name
<< " (age " << age << ")";
}
else if (sex == 'F')
cout << "Miss " << name;
else
cout << "Mr " << name;
}
在CustomerQueue类的私有部分中:
private:
struct Node;
typedef Node* NodePtr;
struct Node
{
CustomerType ct;
Customer cust;
NodePtr next;
};
CustomerQueue类的函数和客户类型的枚举:
enum CustomerType {Senior, Lady, Other};
void CustomerQueue::enqueue (Customer newCust, CustomerType type)
{
NodePtr prev, curr;
findPosition (prev, curr, type);
if (prev == NULL || curr == NULL)
addToTail (newCust, type);
else
{
NodePtr temp = new Node;
temp -> ct = type;
temp -> cust = newCust;
if (compare (type, curr -> ct) == 0)
{
prev = curr;
curr = curr -> next;
}
prev -> next = temp;
temp -> next = curr;
++no;
}
}
void CustomerQueue::printGeneral () const
{
NodePtr temp = head;
cout << "Whole queue information" << endl;
int i = 1;
while (temp != NULL)
{
cout << i << ": " << temp -> ct;
getCust (temp -> cust);
temp = temp -> next;
i++;
}
}
void CustomerQueue::getCust (Customer aCust) const
{
aCust.printCustomer ();
}
在main函数中,我这样做是为了打印出队列。
aQueue.printGeneral ();
输出
整个队列信息
1:1Senior @(年龄4508754) -
哪一部分是错的,为什么名称和年龄的输出是奇怪的符号。
答案 0 :(得分:0)
从构造函数Customer::Customer(char *name, int age)
开始,我猜name
成员也是char*
。
在CustomerQueue::enqueue (Customer newCust, CustomerType type)
中,您按值传递Customer
。这意味着它必须被复制到堆栈中,并且复制需要复制构造函数,尤其是当您在Customer
类中有指针时。
与temp -> cust = newCust;
中的分配相同。
在这种情况下,您可以使用std::string
来避免这种情况,例如
class Customer {
public:
// ...
private:
std::string name;
int age;
char sex;
};
如果您不能或不想使用std::string
,则必须自行分配并释放内存。这也意味着定义复制构造函数,复制赋值运算符和析构函数。