这个问题也出现在普通的 C++ 代码中,但这不是问题,因为在普通的 C++ 中我可以使用“new”而不是“malloc”。
我想要做的是创建一个具有相同接口但功能和成员变量不同的对象的链接列表,并希望使用虚拟类的成员来做到这一点。
但是我遇到了分段错误。我首先在 Arduino C++ 中制作了以下简单的示例代码(基于此):
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
virtual int area (void) =0;
void printarea (void)
{ Serial.println( this->area() ); }
};
class CRectangle: public CPolygon {
public:
int area (void)
{ return (width * height); }
};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
CRectangle rect;
CPolygon * ppoly1 = ▭
ppoly1->set_values (4,5);
ppoly1->printarea();
delay(1000);
}
我也在普通的 C++ 中做了它,希望能找到错误(它只是给了我一个分段错误):
#include <iostream>
#include <stdlib.h>
using namespace std;
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
virtual int area (void) =0;
void printarea (void)
{ cout << this->area() << endl; }
};
class CRectangle: public CPolygon {
public:
int area (void)
{ return (width * height); }
};
int main () {
CRectangle * rect;
rect = (CRectangle*) malloc(sizeof(CRectangle));
* rect = CRectangle();
CPolygon * ppoly1 = rect;
ppoly1->set_values (4,5);
ppoly1->printarea();
return 0;
}
就像我说的,我用 new 试过这个:
int main () {
CRectangle * rect;
rect = new CRectangle;
CPolygon * ppoly1 = rect;
ppoly1->set_values (4,5);
ppoly1->printarea();
return 0;
}
这很好用。
在调试过程中,我不确定从哪里开始。我做错了什么,还是这是 malloc() 的固有限制,因此也是 arv-g++ 的限制?