我正在尝试为一个具有虚函数的类创建一个内联构造函数。
出于总体目的,该函数必须是虚拟的,因为Shape::print
将由另一个类调用,而不知道它正在处理的Shape的类型(确切类型)。
我看到这必须是某种与内存相关的问题。当我使用未构造的Class-Object作为指针时,如何调用此函数?或者我错过了其他什么?
#include <stdio.h>
#include <stdlib.h>
using namespace std;
class Shape {
public:
virtual void print(){};
};
class Circle : Shape {
private:
int r;
public:
Circle(int radius){
this->r = radius;
}
// My "inline-constructor"
static Circle* make(int radius){
Circle* circ = (Circle*) malloc(sizeof(Circle));
circ->r = radius;
return circ;
};
virtual void print(){
printf("%u", this->r);
};
};
int main(){
Circle circObj(5);
circObj.print(); // Works fine
Circle* circPtr = Circle::make(10);
circPtr->print(); // Crashes
return 0;
}
提前致谢,任何帮助都是合理的。
答案 0 :(得分:3)
在你的“inline-constructor”中,你只是分配内存,而不是初始化它。例如,vtable未初始化,导致崩溃,因为print
是虚拟的,并且其地址在vtable中是预期的。
尝试使用Circle* circ = new Circle(radius);
代替malloc
。
答案 1 :(得分:2)
// My "inline-constructor"
static Circle* make(int radius){
Circle* circ = (Circle*) malloc(sizeof(Circle));
circ->r = radius;
return circ;
};
这不是任何一种构造函数。这只是一个错误的工厂方法。它应该只包括
return new Circle(radius);
这使得它变得毫无意义,完全没有意义。
如果在使用未构造的Class-Object但是作为指针使用时,如何调用此函数?
Shape* shape = ....; // for example, new Circle(...)
shape->print();
没有火箭科学
答案 2 :(得分:1)
问题是,malloc
只分配足够的 raw 内存并将其返回。 malloc
未初始化已创建的内存。因此,必须在使用前手动初始化对象的成员。您只对r
执行此操作,但对成员方法print
执行此操作。
您应该使用new
代替malloc
。 new
分两步完成
malloc
的等效任务)