通过指针使用构造函数

时间:2014-06-02 15:20:09

标签: c++

我有一个问题。

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

我想要做的就是在课堂上创建一门新课程。怎么了?

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

2 个答案:

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