2016-05-12 2 views
-2

Я на микроконтроллером (что означает, что я могу иметь только статическое распределение памяти), и я пытаюсь работать с наследованием .....Статический полиморфизм Issue

Пусть у меня есть абстрактный класс Image и абстрактный класс Font. Экземпляр Font может вернуть Image основанную прочь char данных в функции следующим образом:

Font* mf; 
Image* image = mf->GetImage("a"); 

Теперь реальная проблема, я понятия не имею, что делать для GetImage функции.

Проблема заключается в следующем: в C++ для того, чтобы у вас был член абстрактного класса, вы должны использовать его в качестве указателя. Поэтому моя дилемма заключается в том, что у меня есть Font, который хочет создать новый Image, а затем вернуть его.

Если она возвращает указатель на его вновь созданный Image вы возвращаете ссылку на временный объект:

Image* FontImpl::GetImage(char c){ 
    return &ImageImpl(c); //This object is destroyed once this function exits 
} 

И потом, если я вернусь, я пытаюсь вернуть фактический тип, как это:

Image FontImpl::GetImage(char c){ 
    return ImageImpl(c); //Cannot cast from ImageImpl to Image 
} 

Итак, есть ли идиома или что-то для этой проблемы с статической памятью?

+1

Что _static inheritance_ на самом деле? Вы имели в виду _static polymorphism_ в соответствии с [CRTP] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)? –

+0

@ πάνταῥεῖ Да, я имел в виду статический полиморфизм .... Я отредактирую сообщение соответственно – DarthRubik

+0

Использование абстрактных базовых классов - это полиморфизм во время выполнения, а не статический полиморфизм. Вы занимаетесь статическим распределением памяти. Хотя, если это становится громоздким, вам, возможно, захочется изучить или загрузить небольшой пул пула памяти, так что сделайте динамическое выделение из статического буфера самостоятельно. –

ответ

1

Использование динамического распределения будет проще всего, но если это невозможно, вы должны хранить экземпляр где-то за пределами функции, например .:

static ImageImpl image; 

Image& FontImpl::GetImage(char c) { 
    image = ImageImpl(c); 
    return image; 
} 
+0

Должно возвращать 'Image *' и '& image', и стоит упомянуть, что нужно использовать« возвращенное »изображение, должно быть выполнено до того, как' GetImage' будет вызван снова, поскольку он перезапишет ранее возвращенное изображение. –

Смежные вопросы