Я разработчик встроенного программного обеспечения и из мира бит и C. В этом мире есть данные во флэш-памяти, представленные const в C. И есть данные в ОЗУ. ОЗУ стоят дорого и ограничены, а флеш-память дешевая и достаточно. Кроме того, динамическое распределение памяти с использованием new, delete, malloc и т.д. Не допускается из-за проблемы фрагментации или правил безопасности, предпочтительны статические конструкции.
У меня около 2000 объектов, которые имеют одинаковые постоянные свойства, но отличаются поведением. Поэтому для них я определил Shape Class как базовый класс, который содержит общие свойства моих объектов. И для представления различного поведения Shape Class имеет один абстрактный метод под названием Print(), который будет перезаписан родителями.
ShapeList - важная часть. Это массив констант, состоящий из "const Shapes", так что они будут помещены в секцию флэш-памяти компоновщиком.
Ниже программа выводит результат:
I'm a Shape has 3 dots
I'm a Shape has 4 dots
I'm a Shape has 5 dots
Ожидаемый результат:
I'm a Triangle has 3 dots
I'm a Rectangle has 4 dots
I'm a Pentagon has 5 dots
Мне нужно полиморфное поведение. Когда я печатаю Треугольник, он должен вести себя как Треугольник, а не как Форма. Как я могу это сделать?
Спасибо.
#include <array>
#include <cstdio>
class Shape
{
public:
const int DotCount;
Shape(const int dot): DotCount(dot) {}
virtual void Print(void) const; // this is virtual method
};
void Shape::Print(void) const
{
printf("I'm a Shape has %d dots\n", DotCount);
}
class Triangle: public Shape
{
public:
Triangle(void): Shape(3) { }
void Print(void) const;
};
void Triangle::Print(void) const
{
printf("I'm a Triangle has %d dots\n", DotCount);
}
class Rectangle: public Shape
{
public:
Rectangle(void): Shape(4) { }
void Print(void) const;
};
void Rectangle::Print(void) const
{
printf("I'm a Rectangle has %d dots\n", DotCount);
}
class Pentagon: public Shape
{
public:
Pentagon(void): Shape(5) { }
void Print(void) const;
};
void Pentagon::Print(void) const
{
printf("I'm a Pentagon has %d dots\n", DotCount);
}
const std::array<const Shape, 3> ShapeList = { Triangle(), Rectangle(), Pentagon() };
int main(void)
{
ShapeList.at(0).Print();
ShapeList.at(1).Print();
ShapeList.at(2).Print();
return(0);
}
Больше проблем: Сегодня я понял, что есть еще одна проблема с виртуальными функциями. Когда я добавляю какие-либо виртуальные функции в базовый класс, компилятор начинает игнорировать директиву "const" и автоматически помещает объект в ОЗУ вместо флэш-памяти. Я не знаю почему. Я задал этот вопрос в IAR. Вывод, который я получил до сих пор, заключается в том, что полиморфное поведение невозможно с ROMable классами даже с кучей:/