我是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 \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
答案 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,不再需要了。