我有一个问题。
编译器一直警告我无效使用构造函数。
我想要做的就是在课堂上创建一门新课程。怎么了?
int StArray::addCS_Course(int id, int CourseNum, char* CourseName,int HwNum, float HwWeigh, bool Takef, char* BookName){
int i;
CS_Course* course;
if ((CourseNum<0)||(HwNum<0)||(HwWeigh<0)||(HwWeigh>1))
return 0;
for (i=0;i<StudentNum_;i++){
if (Arr_[i]->getID()==id) {
course=(CS_Course*)malloc(sizeof(CS_Course*));
if (course==NULL) {
fprintf(stderr,"Malloc failed\n");
exit(0);
}
course->CS_Course::CS_Course(CourseNum,CourseName,HwNum,HwWeigh,Takef, BookName);
if (Arr_[i]->addCS_Course(course)==1)
return 1;
else
{
free(course);
return 0;
}
}
}
return 0;
}
答案 0 :(得分:2)
要在C ++中创建新对象,您不能这样做:
course = (CS_Course*) malloc(...);
course->CS_Course::CS_Course(...);
你这样做:
course = new CS_Course(...);
该代码负责分配内存并调用构造函数。
然后,您使用delete course;
而非free(course);
(但正如juanchopanza在评论中指出的那样,在C风格的堆上创建对象时,这被认为是不好的形式 - 你应该更喜欢使用标准库容器并避免使用{{1}那是一个完整的讨论 - 你可能想阅读一篇关于现代C ++的教程。)
@RemyLebeau编辑:如果您需要在现有内存中构建对象,请改为使用 placement new :
new
但是你必须手动调用析构函数:
buffer = malloc(...);
course = new (buffer) CS_Course(...);
答案 1 :(得分:1)
malloc(sizeof(CS_Course*))
为指向CS_Course
的指针分配足够的空间,而不是CS_Course
本身。如果malloc
是为对象动态分配内存的正确方法,则需要像这样调用它:
malloc(sizeof(CS_Course));
然而,malloc
不是正确的方法;在C ++中,您使用new
为对象动态分配内存:
course = new CS_Course; //Use the default constructor
或
//Use constructor with 2 parameters
course = new CS_Course(constructor_param1, constructor_param2);
当然,如果你不需要指针,你可以(并且应该)创建一个这样的CS_Course对象(通常称为在堆栈上分配):
CS_Course course; //default constructor
//constructor with 2 parameters
CS_Course course2(constructor_param1, constructor_param2);