C ++ наследование и шаблоны - PullRequest
1 голос
/ 22 июня 2011

У меня есть шаблон списка.

Я хочу составить список работ.Тем не менее, у меня разные задания, когда единственная другая вещь - это функция executeJob ().

Итак, у меня есть класс Job:

class Job{...
...
public:
..
virtual SomeType executeJob() = 0;
}

Так что это на самом деле абстрактный класс и в производномклассы, все частные поля одинаковы, и у него есть реализация для собственного executeJob ().

Допустим, есть 2 различных типа производных классов с именами Job1 и Job2, поэтому я действительно хочу, чтобы мой списокчтобы иметь возможность иметь Job1 objects и job2 Objects.

Мой список определяется следующим образом: List<Job>.

Но в ListNode c'tor у меня есть это:

    listNode(const T& value) : value(new T(value)), prevNode(NULL),
    nextNode(NULL){}

и, конечно, у меня проблема со строкой: value(new T(value)), поскольку это абстрактный класс.Как мне решить эту проблему, чтобы я все еще мог хранить список как Job1 and Job2 objects и определять его как List<Job>?

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Простой, вы не можете взять T в конструкторе.

Вам нужен шаблонный конструктор, который принимает настоящий класс. Затем вы вызовете конструктор по типу параметра.

Если у вас нет типа, и вы просто передаете «Job», вам придется переключиться на проектирование на основе прототипа с помощью виртуального clone() метода (вместо вызова конструктора).

Редактировать: Поскольку вы используете new, я предполагаю, что List<Job> является опечаткой, и вы имели в виду List<Job*>

0 голосов
/ 22 июня 2011

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

Типы несовместимы, если вы не воспользуетесь предложением о сохранении указателей на базовый класс в вашем списке. Таким образом, если B и D происходят от A, то вы можете хранить B * и D * в списке, но получать к ним доступ через A *.

0 голосов
/ 22 июня 2011

Вы не можете иметь список, содержащий разные объекты.

Хотя вы можете иметь список указателей на базовый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...