一个初学者c++程序的APPCRASH,在函数上调用一个公共方法



我是C++OOP的新手。

我正在写一个C++程序来操纵汽车列表,我已经定义了一个汽车类,有5个属性(brand, name, engine, hpspeed),并有两个公共函数(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 nn" ;
        }
        void show (){
            cout << " - "  << brand << " " <<model << " , " << engine << " " << hp << "hp " << fixed << setprecision(1) << speed << " km/h .n" ;
        }
};

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

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 nn" ;
}

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

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

是分配问题吗?函数调用问题?非常感谢

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

你应该避开c++ 中的malloc()(除了非常罕见和通常非常低级的任务)

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

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

我还更改了函数,使其通过引用而不是指针来接受参数(因为这是c++中按引用传递的方式)。


其他说明:

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

  • 不要使用typedef struct X { ... } X;的C-ism。c++对结构体标签和其他名称有相同的名称空间,所以只使用struct X { ... };。这仍然允许您使用X来引用类型,而无需将其拼写为struct X

  • 将指针隐藏在类型定义后面通常不是一个好主意,因为这会使代码更难阅读。只要显式地使用clinked*,代码的语义将更加明显。

  • 在现代c++中,你想要远离原始指针拥有内存-最好使用智能指针(如std::unique_ptr)。

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

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

同样,不要在c++中使用typedef struct

相关内容

  • 没有找到相关文章

最新更新