C++ 通过指针使用构造函数

C++ 通过指针使用构造函数,c++,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&

我有个问题

编译器不断警告我构造函数的使用无效

我想做的就是在课堂上开设一门新课程。怎么了

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;
}
int-StArray::addCS\u课程(int-id,int-CourseNum,char*CourseName,int-HwNum,float-hwweight,bool-Takef,char*BookName){
int i;
CS_课程*课程;
如果((CourseNumaddCS_Course(Course)==1)
返回1;
其他的
{ 
免费(课程);
返回0;
}
}
}
返回0;
}

<代码> > p>在C++中创建一个新的对象,你不这样做:

course = (CS_Course*) malloc(...);
course->CS_Course::CS_Course(...);
您可以这样做:

course = new CS_Course(...);
该代码负责分配内存和调用构造函数

然后使用
删除课程;
而不是
免费(课程);

(但正如JuangopaZa指出的,在C样式堆中创建对象是这样的,这是不好的形式。你应该更喜欢使用标准库容器,避免使用<代码>新< /COD>。这是一个完整的讨论-你可能想读一个关于现代C++的教程)

@RemyLebeau编辑:如果您需要在现有内存中构造对象,请使用placement new:

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

course->~CS_Course();
free(buffer);
malloc(sizeof(CS\u Course*)
为指向
CS\u Course
指针分配足够的空间,而不是
CS\u Course
本身。如果
malloc
是为对象动态分配内存的正确方法,则需要这样调用它:

malloc(sizeof(CS_Course));
< > >代码> MalOC/不是正确的方法;在C++中,使用<代码>新< /Cord>动态分配对象的内存:

course = new CS_Course; //Use the default constructor

当然,如果您不需要指针,您可以(并且应该)像这样创建一个CS_课程对象(通常称为堆栈上的分配):


使用<代码>新< /COD>,不是 MalCube()>代码>!当然> CSHReal::CSL课程不是C++的构建。你在做什么?你在创建CSL课程的列表吗?如果你真的必须调用已经分配的内存上的构造函数,那就调用。但是,如图所示,使用“平原<代码>新< /代码>(或者更好的是代码> STD::MaxIO:SuxIOL)。(CourseNum,……):C++中的什么书或教程是用C++来编写代码示例,代码是使用<代码> MalOC 而不是<代码>新< /代码>?我问,因为这似乎经常出现在这里,初学者在使用<代码> MalOC 。@ JuangopaZa,不知道更多关于<代码> ARARY[i]的代码。
这是一个艰难的销售,但堆栈分配绝对值得记住。@juanchopanza,这不是一个函数声明吗?@user2079303不,因为
()
之间的内容是参数。@RemyLebeau:我认为你的编辑(关于新的位置)这是一个新手的问题。新手是一个专家结构,它是最不相关的,而且最坏的误导。新手OP可以轻松地阅读这篇文章,并认为新的布局是在C++中创建对象的公认方法。
course = new CS_Course; //Use the default constructor
//Use constructor with 2 parameters
course = new CS_Course(constructor_param1, constructor_param2);
CS_Course course; //default constructor
//constructor with 2 parameters
CS_Course course2(constructor_param1, constructor_param2);