将类对象传递给列表

时间:2014-11-17 14:03:14

标签: c++ arrays list class

我有一个结构列表,一个类castomer。我想将castomer存储到列表中。为此我每次都创建一个castomer,然后我将它们打到列表中。没有错误,除了每次我尝试将castomer存储到我的表中时程序崩溃。 我有这个清单和班级:

class castomer{
private:
 string name;
 string lastname;
 int number;
 double time;
public:
    void setAll(string,string,int,double);
    int numberR(){return number;}
    double timeR(){return time;}
    void displayAll();
};

struct node {
castomer person;
struct node *next;
};

此功能用于添加castomer

void add(clock_t *start,struct node *table[])
{
 *start = clock();
 double time=(double)*start;
 int i=0;
 while(table[i]!=NULL)
 {
     i++;
 }
if(i > 24)
    cout << "We are not able to add another castomer becase we are full please wait for ont to go "<<endl;
else{
    castomer c1;
    cout<<i;
    cout<< "Give me the castomers name and lastname :";
    string temp1,temp2;
    cin>>temp1;
    cin>>temp2;
    c1.setAll(temp1,temp2,i,time);
    table[i]->person=c1;//my program crases here anyone knows why?
}
}

ps:在我的主要内容table[]看起来像struct node * table[25];

3 个答案:

答案 0 :(得分:0)

struct node* table[25]

这是将表声明为25个指针的数组。你必须为每个指针分配内存,这些指针从你的代码中缺失。

答案 1 :(得分:0)

在您的while循环后,table[i]将为NULL

table[i]->person = c1; // Your program crashes here because of that.

按原样使用您的代码,您应该

table[i] = new node;
table[i]->person = c1;

但代码看起来很奇怪,就像你想要实现一个链表(node结构)但由于某种原因坚持使用数组。
如果您的目标是链接列表,则需要重新考虑很多代码 如果不是,您可以完全失去node类型。

答案 2 :(得分:0)

由于您正在使用(或尝试使用)C ++,我将提及您可以采取的一些措施来改进您的代码并让您的生活更轻松。

在C ++中,您可以定义用于初始化对象的构造函数。

您的功能setAll是一种不好的做法。在创建之后,您并不真的想要更改人员的所有数据。您只想在创建时初始化数据。好吧,使用构造函数

您不需要指针

对于您想要做的事情,您不需要使用指针使代码复杂化,您可以传递参数by reference

您使用的是C ++,使用STL

特别是 vector 我保证,会帮助您。

使用cout <<显示您的对象

您可以在班级中添加friend ostream& operator<<函数,以便能够编写如下代码:

Customer a;
cout << a << endl;

一个完整的例子:

#include <iostream>
#include <vector>
#include <ctime>
#include <string>

using namespace std;

class Customer
{
    public:
        Customer(){}                    // default constructor.
        Customer(string pname, string plastname): name(pname), lastname(plastname)
        {
            id = ++idgen;               // Set an id number.
            time = (double)clock();     // initialize time.
        }   
        int getId() {return id;}        // former numberR().
        double getTime() {return time;} // former timeR().

        friend ostream& operator<<(ostream &out, Customer obj)
        {out << obj.name << " " << obj.lastname << ". " << "Id: " << obj.id << " Time: " << obj.time;}

    private:
        static int idgen;               // static values are a good way for keep some sort of id.
        int id;                         // former member: number.
        double time;                    // Why don't use clock_t directly?
        string name, lastname;
};

int Customer::idgen = 0;    // Initialize static variable.

int main()
{

    int const MAX_NUMBER_PERSONS = 2;

    std::vector<Customer> customer_list;

    string name, lastname;
    while (customer_list.size() < MAX_NUMBER_PERSONS)
    {
        cout << "Give me the castomers name and lastname <name> <lastname>:";
        cin >> name >> lastname;
        customer_list.push_back(Customer(name, lastname));
    }


    for (auto &x: customer_list)    // If you're learnign C++ its a good moment for search 
    {                               // for c++11 doc.
        cout << x << endl;
    }

    return 0;
}