初学者 C++ 程序上的 APPCRASH,调用函数的公共方法
Posted
技术标签:
【中文标题】初学者 C++ 程序上的 APPCRASH,调用函数的公共方法【英文标题】:APPCRASH on a beginner C++ program , calling a public method on a function 【发布时间】:2014-03-19 14:37:20 【问题描述】:我是 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();
并在readvalues();
函数中输入model
字符串值以填充新节点的属性时,程序崩溃。但是当我在 main();
中声明的对象上调用 readvalues();
时它不会崩溃
这是分配问题吗?函数调用问题?谢谢
【问题讨论】:
你应该找到那个告诉你用 malloc 分配 C++ 对象并告诉他们你讨厌他们的人。 并确保你真的恨他们复仇。大约5分钟。然后,把它换成一种自鸣得意的优越感 是的,是的,让对 malloc 的仇恨流过你,你到 C++ 的转换就完成了。 使用 malloc, -ve vote @thecoshman 你的意思是你对一个问题投反对票是因为它包含“要问的错误问题吗?” 【参考方案1】:您正在使用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 X ... ;
。这仍然允许您使用X
来引用类型,无需将其拼写为struct X
。
将指针隐藏在 typedef 后面通常是个坏主意,因为它会使代码更难阅读。只需显式使用clinked*
,代码的语义就会更加明显。
在现代 C++ 中,您希望远离拥有内存的原始指针 - 为此使用智能指针(如 std::unique_ptr
)要好得多。
【讨论】:
谢谢,问题解决了,malloc 是罪人!再次感谢 @reaffer:希望您采纳了此答案中的所有其他建议。这是重要的东西。 还想考虑应该避免动态分配内存。喜欢“自动”使用事物。如果你想要一个foo
类型的对象,只需创建一个foo myFoo
而不是动态创建一个。倾向于我更容易使用的代码。当然,动态分配的内存是你在某些地方需要的东西,但应该因为你需要它而使用它,而不是因为这就是你所知道的。
@thecoshman 当然,一般来说是正确的。但是,请注意,这正是 OP 在这里实际执行的操作 - car kar
具有自动存储持续时间,并且由于 clinked
是链表的一个元素,它几乎必须动态分配。【参考方案2】:
不要使用malloc
,当你初始化string
成员时这是错误的。
【讨论】:
【参考方案3】:不要使用malloc
创建C++ 类的实例,使用new
。这将确保调用所有构造函数,并且正确初始化您的成员变量。
另外,不要在 C++ 中使用 typedef struct
。这是一个 C 主义,不再需要了。
【讨论】:
以上是关于初学者 C++ 程序上的 APPCRASH,调用函数的公共方法的主要内容,如果未能解决你的问题,请参考以下文章