Эта проблема также появляется в обычном C++-коде, но это не проблема, потому что в обычном C++ я могу использовать «новый» вместо «malloc».Использование наследования классов и malloc (на arduino)
Что я хочу сделать, это связанный список объектов, которые имеют один и тот же интерфейс, но разные функции и переменные-члены, и надеялись сделать это с помощью членов виртуального класса.
Но я получаю ошибку сегментации. Я сделал следующий простой пример кода (на основе this), первый в 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;
}
Как я уже сказал, я попытался это с использованием новых:
int main() {
CRectangle * rect;
rect = new CRectangle;
CPolygon * ppoly1 = rect;
ppoly1->set_values (4,5);
ppoly1->printarea();
return 0;
}
и работает отлично.
Я не совсем уверен, куда идти отсюда в процессе отладки. Я что-то делаю неправильно, или это неотъемлемое ограничение malloc() и, следовательно, arv-g ++?
Что именно вы имеете в виду с _'normal C++ '_ ?? Если у вас есть компилятор C++, и у вас есть реализация stdlib, которая поддерживает 'malloc()', 'new' должна работать отлично в коде C++. Что произойдет, если вы используете 'new' с вашей аркойной перекрестной цепью? –
'malloc()' никогда не будет работать для этого BTW, потому что помимо выделения памяти вам нужны правильно построенные (инициализированные) экземпляры классов. –
Я программирую для arduino, поэтому мне нужно использовать компилятор arv-g ++.Я где-то читал, что этот компилятор не поддерживает новые и удаляет, только malloc и связанные с ним функции, поэтому я никогда не думал попробовать. По-видимому, ребята из arduino добавили поддержку в свои библиотеки, и я никогда не думал попробовать ... –