通过指针使用构造函数

Using a Constructor through pointer

本文关键字:构造函数 指针      更新时间:2023-10-16

我有一个问题。

编译器一直警告我无效地使用构造函数。

我想做的就是在班上创建一个新课程。什么错了吗?

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 failedn");
                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;
}

要在c++中创建一个新对象,不能这样做:

course = (CS_Course*) malloc(...);
course->CS_Course::CS_Course(...);

你这样做:

course = new CS_Course(...);

该代码负责分配内存和调用构造函数。

然后用delete course;而不是free(course);删除对象

(但是正如juanchopanza在评论中指出的那样,像这样用C风格在堆上创建对象被认为是不好的形式——你应该更喜欢使用标准库容器,避免使用new。这是另一个话题了——你可能想读一本关于现代c++的教程。

Edit by @RemyLebeau:如果你需要在现有内存中构造一个对象,使用placement new代替:

buffer = malloc(...);
course = new (buffer) CS_Course(...);

但是你必须手动调用析构函数:

course->~CS_Course();
free(buffer);

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);