如何从班级中的班级打印信息?

时间:2018-02-10 09:39:02

标签: c++

我正在创建一个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) -

哪一部分是错的,为什么名称和年龄的输出是奇怪的符号。

1 个答案:

答案 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,则必须自行分配并释放内存。这也意味着定义复制构造函数,复制赋值运算符和析构函数。

另请参阅cppreference.comWikipedia

中的三条规则