Как создать массив абстрактного класса с
Перейти к содержимому

Как создать массив абстрактного класса с

Не могу объявить массив указателей на класс, который наследуется об абстрактного класса

Есть класс родитель Function у него есть три наследника Line Cube and Hyperbola.

При объявление массива указателей на это класс не могу присвоить им значения.<code>вот скрин ошибок(работаю в xcode 8</code>

user avatar

Ваши классы-наследники реализуют не все чисто-виртуальные методы. Они либо должны реализовывать makeARezalt(), либо он должен быть просто виртуальным, либо вообще не виртуальным. Кстати, вы забыли про виртуальный деструктор в базовом классе и в наследниках, без него ваши объекты гарантированно будут неправильно удалены.

И если уж вы пишете на c++, используете std::vector<std::unique_ptr<Function>> для массива указателей.

Edit: Вот вариант решения. Для std::make_unique нужен c++14, но можно создавать объекты просто через new.

У вас нет реализаций double Value(); , вы передаете в них параметры — значит, сигнатуры разные, так что.

Я бы на вашем месте делал

Ну, а наследники должны реализовывать соответствующую функцию, типа

Ну вот на фига вы передавали в Value() значения a , b и c . Если вы их храните в классе?

как создать массив абстрактного класса в Stack Overflow

Я пытаюсь создать программу, которая принимает заказ на питание и распечатывает его. У меня есть базовый класс Food который имеет чисто виртуальную функцию в нем. Класс Food имеет 2 подкласса Pizza а также Dessert , Я пытаюсь сделать массив из Food в моем main поэтому, когда клиент заказывает Pizza или же Dessert будет храниться в массиве Food , Но каждый раз, когда я пытаюсь, я получаю ошибку. Как мне тогда соединить эти два элемента, если я хочу использовать цикл для просмотра каждого элемента, который заказал клиент?
Это мой код:

Это мое сообщение об ошибке. (НОТА: get_set_price() а также print_food() мои чисто виртуальные функции, которые определены в базовом классе и реализованы в 2 подклассах)

Решение

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

затем работать с array

Другие решения

Для этого вам нужна ссылочная семантика, потому что Food arr[2]; пытается инициализировать массив значениями по умолчанию (которые являются абстрактными, а следовательно, неконструктивными).

Я думаю std::array<std::unique_ptr<Food>, 2> arr; должно быть наиболее естественным для использования в этом случае.

Если вы просто хотите зациклить эти два значения, используя initializer_list было бы проще, я полагаю.

К сожалению это не выведет правильный тип из просто , но помощник может быть создан, я полагаю,

Начиная с C ++ 11, вы можете использовать std::reference_wrapper тоже. Это очень похоже на ответ @ Mykola, но использует ссылки:

К сожалению, к этому и к версии с указателями применяется одинаковое ограничение. Вам нужно определить локальные переменные, нельзя просто использовать анонимные объекты.

Массив абстрактного класса

почему я не могу создать экземпляр абстрактного класса, а сделать массив абстрактного класса?

8 ответов

создание экземпляра означает создание экземпляра класса. В приведенном выше сценарии, вы только что объявили gamesArray типа Game С размерами 10 (только ссылки и ничего больше). Вот почему он не бросает никакой ошибки.

вы получите ошибку, когда попытаетесь сделать

но сделать массив абстрактного класса?

позже, вы можете сделать что-то подобное

это очень разрешено, и именно поэтому вы будете заниматься абстрактным классом в первую очередь.

потому что, когда вы делаете массив некоторого типа объекта, вы не пытаетесь создать экземпляр объектов. Все, что вы делаете, это несколько слотов для размещения ссылок.

new Game[10]; дает 10 слотов для Game ссылки, но это не делает один Game .

потому что вы не нарушаете abstract class правила.По существу,

при создании объектов вполне допустимо для абстрактных классов, инициализация не допускается.

An Abstract класс-это тот, чей экземпляр не может быть создан.

Создание массива, который содержит ссылочную переменную объекта этого абстрактного класса, — это просто ссылки не сам объект.

An Abstract класс а Interface в Java используется для реализации поведения, которое постоянно меняется. Рассмотрим Abstract class like laying down some protocols for its concrete classes.

например:

абстрактные классы не могут быть созданы, они могут быть расширены. Массивы на самом деле являются объектами, вы просто говорите своему JVM : Эй, приятель, освободите место для 10 игровых объектов. Вот и все, вы не создаете никаких игровых объектов.

игры = новая игра(); Это создает экземпляр абстрактной игры класса, который не разрешен.

Создание массива со следующим Game[] gamesArray = новая игра[10];

является просто объявлением игрового объекта, здесь он не создает экземпляр. как игра игры;

либо вы объявляете 10 объектов игрового класса, либо массив ящиков игры одинаковы, просто распределение памяти будет отличаться.

абстрактный класс, как следует из названия, не может быть создан. Когда вы сделали Game[] gamesArray = new Game[10]; Он создает array который может содержать Game references . Давайте попробуем соотнести это с реальным жизненным сценарием.

скажем, у вас есть абстрактный класс Animal . Вы не можете создать экземпляр, так как животное не является конкретным классом, поэтому Animal obj = new Animal() потерпит неудачу. Но!—5—> создаст массив, который может содержать ссылки на 10 объектов типа животных, таких как собака, кошка, лошадь и так далее.

абстрактные классы не имеют методов полностью конкретизированы. Они используются в качестве базовых классов, которые будут расширяться другими классами, «наследующими» их.

например, вы можете иметь абстрактный класс под названием Пэт.

это может быть расширено унаследованными классами:

оттуда вы можете иметь вещи в своем коде, такие как:

и вы можете создавать массивы домашних животных, которые будут принимать как кошек, так и собак, как приемлемые элементы.

для получения дополнительной информации я бы рекомендовал вам посмотреть раздел учебника java, охватывающий абстрактные классы здесь.

Добавить комментарий

Ваш адрес email не будет опубликован.