我是C++
和OOP
的新手。
我正在写一个C++
程序来操纵汽车列表,我已经定义了一个汽车类,有5个属性(brand
, name
, engine
, hp
和speed
),并有两个公共函数(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
。