在初学者C ++程序上APPCRASH,在函数上调用公共方法

时间:2014-03-19 14:37:20

标签: c++ function class methods linked-list

我是C++OOP的新手。

我正在写一个C++程序来操纵汽车清单,我已经定义了一个有5个属性的汽车类(brandnameenginehpspeed)并且有两个公共函数(readvalues():填充属性和show():显示属性)

class car {
    string brand ;
    string model ;
    string engine ;
    int hp ;
    float speed ;

    public :
        void readvalues (){
            cout << "\n Brand :" ;
            getline(cin,brand,'\n');
            cout << " Model name :" ;
            getline(cin,model,'\n');
            cout << " Engine name :" ;
            getline(cin,engine,'\n');
            cout << " Horsepower :" ;
            cin >> hp ;
            hp = abs(hp);
            cout << " Max speed :" ;
            cin >> speed ;
            speed = abs(speed);
            cout << "  Done \n\n" ;
        }
        void show (){
            cout << " - "  << brand << " " <<model << " , " << engine << " " << hp << "hp " << fixed << setprecision(1) << speed << " km/h .\n" ;
        }
};

然后我定义了我的链表的数据结构,节点的类型是clinked(它包含一个汽车和指向另一个节点的指针)

typedef struct clinked {
    car kar ;
    struct clinked * next ;
}clinked;

typedef clinked * clist ;

然后我定义了一个在列表中插入新节点的函数

void addcar ( clist * h ){
    clist t ;
    t = (clist)malloc(sizeof(clinked)) ;
    (t->kar).readvalues();
    t->next = *h ;
    *h = t ;
    cout << "  Done \n\n" ;
}

问题是当我调用addcar();并且我在调用的model函数中输入readvalues();字符串值以填充新节点的属性时,程序崩溃。但是当我在readvalues();

中声明的对象上调用main();时,它不会崩溃

这是分配问题吗?一个函数调用问题? Thnx

3 个答案:

答案 0 :(得分:4)

你正在使用malloc(),它分配原始内存;它对C ++类一无所知,因此不会调用任何构造函数。

您应该避开C ++ 中的malloc()(非常罕见且通常极低级别的任务除外)

相反,使用new,它将分配正确的内存调用所涉及的构造函数:

void addcar ( clist & h ){
    clist t = new clinked();
    t->kar.readvalues();
    t->next = h ;
    h = t ;
    cout << "  Done \n\n" ;
}

我还改变了函数,通过引用而不是指针来获取它的参数(因为这是C ++传递引用的方式)。


附加说明:

  • 如果您想为学习目的实现自己的链接列表,当然可以,但我不建议将其用于C ++和/或OOP初学者。你最好使用标准库std::list<car>

  • 请勿使用typedef struct X { ... } X;的C-ism。 C ++与struct标签和其他名称具有相同的名称空间,因此只需执行struct X { ... };。这仍然允许您使用X来引用该类型,无需将其拼写为struct X

  • 将指针隐藏在typedef后面通常是一个坏主意,因为它使代码更难阅读。只需明确使用clinked*,代码的语义就会更加明显。

  • 在现代C ++中,你希望远离拥有内存的原始指针 - 使用智能指针(如std::unique_ptr)要好得多。

答案 1 :(得分:0)

不要使用malloc,当你初始化string成员时,这是错误的。

答案 2 :(得分:0)

不要使用malloc创建C ++类的实例,请使用new。这将确保调用所有构造函数,并确保正确初始化您的成员变量。

另外,不要在C ++中使用typedef struct。这是一个C-ism,不再需要了。