我正试图为一个类创建一个内联的构造函数,它有一个虚拟函数。出于总体目的,函数必须是虚拟的,因为Shape::print
将由另一个类调用,而不知道它要寻址的是哪种形状(确切类型(。
我认为这一定是一个与记忆有关的问题。当使用未构造但作为指针的类对象时,如何调用此函数?还是我错过了什么?
#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;
}
提前感谢,任何帮助都是值得的。
在"内联构造函数"中,您只是在分配内存,而不是初始化它。例如,vtable没有初始化,导致崩溃,因为print
是虚拟的,并且它的地址应该在vtable中。
尝试Circle* circ = new Circle(radius);
而不是malloc
。
// My "inline-constructor"
static Circle* make(int radius){
Circle* circ = (Circle*) malloc(sizeof(Circle));
circ->r = radius;
return circ;
};
这不是任何类型的构造函数。这只是一个写错的工厂方法。它应该只包括
return new Circle(radius);
这使得它变得如此琐碎以至于毫无意义。
当使用未构造但作为指针的类对象时,如何调用此函数?
Shape* shape = ....; // for example, new Circle(...)
shape->print();
无火箭科学
问题是,malloc
只分配了足够的原始内存并返回。malloc
不会初始化创建的内存。因此,在使用之前必须手动初始化对象的成员。您只对r
执行此操作,而不对成员方法print
执行此操作。
您应该使用new
而不是malloc
。new
分两步工作
- 使用运算符new分配足够的内存(相当于
malloc
的任务( - 调用对象的构造函数来初始化它,它实际上为成员设置值