2014-02-02 5 views
1

Я относительно новичок в C++, и у меня есть время, когда моя основная программа создает экземпляр класса. Я привык к java, поэтому не уверен, смешиваю ли я два языка, когда я пытаюсь это сделать, и это моя проблема, или, может быть, я просто не понимаю концепцию правильно.Реализация интерфейса класса шаблона

Объект моей программы: Цель этой программы - создать класс шаблона из интерфейса, который будет создавать отсортированный массив, который вы можете добавлять и удалять из него, сохраняя при этом его сортировку.

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

Шаг 1: Я создал свой упорядоченный интерфейс:

sortedInterface.h 
#ifndef _SORTED_INTERFACE 
#define _SORTED_INTERFACE 

#include <vector> 
using namespace std; 

template<class ListItemType> 
class sortedInterface 
{ 
public: 
    virtual bool sortedIsEmpty(); 
    virtual int sortedGetLength(); 
    virtual bool sortedInsert(ListItemType newItem); 
    virtual bool sortedRemove(ListItemType anItem); 
    virtual bool sortedRetrieve(int index, ListItemType dataItem); 
    virtual int locatePosition(ListItemType anItem); 

}; // end SortedInterface 
#endif 

я использовал интерфейс для создания файла sorted.h:

sorted.h 
#include "sortedInterface.h" 
#include <iostream> 
#ifndef SORTED_H 
#define SORTED_H 

using namespace std; 

template<class ListItemType> 
class sorted 
{ 
    public: 
     sorted(); 
     sorted(int i); 
     bool sortedIsEmpty(); 
     int sortedGetLength(); 
     bool sortedInsert(ListItemType newItem); 
     bool sortedRemove(ListItemType anItem); 
     bool sortedRetrieve(int index, ListItemType dataItem); 
     int locatePosition(ListItemType anItem); 
    protected: 
    private: 
     const int DEFAULT_BAG_SIZE = 10; 
     ListItemType items[]; 
     int itemCount; 
     int maxItems; 
    }; 

#endif // SORTED_H 

и, наконец, я создал sorted.cpp (I включены только конструктор теперь, как я даже не могу получить, что работа)

#include "sorted.h" 

#include <iostream> 

using namespace std; 


template<class ListItemType> 
sorted<ListItemType>::sorted() 
{ 
    itemCount = 0; 
    items[DEFAULT_BAG_SIZE]; 
    maxItems = DEFAULT_BAG_SIZE; 
} 

Моя основная программа:

#include "sortedInterface.h" 
#include "sorted.h" 
#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    sorted<string> sorted1 = new sorted(); 

    return 0; 
}; 

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

+1

Какие ошибки вы ели? Из-за того, как работают шаблоны, обычно вам нужно также поместить определение шаблона в файл заголовка. – Chad

+0

Создание виртуальных элементов для членов требует реализации. [Чистый виртуальный] (http://en.cppreference.com/book/intro/abstract_classes#Pure_virtual) - это то, что вы, вероятно, после. – Siege

+0

Что касается терминологии, это «шаблон шаблона», а не «шаблонный класс». «Шаблон класса» не является классом, он является шаблоном для создания классов. – juanchopanza

ответ

1

1) оператор «новый» возвращает указатель, а не объект.

sorted<string>* sorted1 = new sorted<string>(); 

2) Однако в вашем маленьком примере нет необходимости создавать sorted1, используя «новый».

sorted<string> sorted1; 

Одно слово совета - Java не является C++. Вы сделали две ошибки, которые делают многие программисты Java, создаваемые при написании кода на C++, а именно: 1) полагая, что для создания объекта вы должны использовать «новый» и 2), что «новый» возвращает ссылку.

+1

Другая ошибка заключается в том, чтобы думать, что все требует интерфейсов. О, и «используя пространство имен std». И поместив реализацию шаблона класса в файл '.cpp'. – juanchopanza

+0

Итак, я переключил свой код так, как вы заявили Пол, но я получаю сообщение об ошибке: undefined ссылка на 'отсортировано :: отсортировано() '| – itsmepetey

+0

Какая ошибка? Вы читали комментарии juanchopanza? Скорее всего, это ошибка компоновщика, а не ошибка компилятора. Если да, просмотрите комментарии, сделанные juanchopanza, в отношении того, что вы не создаете файл .cpp для реализации шаблона (и тем самым компилируете файл .cpp как отдельный модуль). – PaulMcKenzie

1

В вашем интерфейсе/реализации есть несколько ошибок. Шаблон класса обычно реализуется целиком в заголовке, в котором он объявлен; это связано с тем, что компилятор создает совершенно новый тип для каждого типа, который вы используете с вашим шаблоном.

Во-вторых, в вашем шаблоне sortedInterface вы создали виртуальные элементы, которым по-прежнему требуется определение, но вы его не доставляете. Вы можете пометить свои функции-члены с помощью = 0;, чтобы сделать их всех pure virtual, что означает, что классы, наследующие ваш sortedInterface, должны будут реализовать эти элементы вместо этого.

В-третьих, как указал PaulMcKenzie, operator new() возвращает указатель на объект, выделенный для кучи, но вы ожидаете тип значения.

Наконец, пожалуйста, взгляните на smart pointers, если вы используете голый new() s везде.

+0

Благодарим за отзыв. Несколько вещей все еще меня путают: 1.), поэтому я должен реализовать все функции в файле sorted.h, а не в sorted.cpp? 2.) и т. Д. В sortedInterface мне не нужно что-либо внутри области аргументов для каждой функции, а просто установить его = 0? – itsmepetey

0

я заметил следующие дополнительные аномалии во всей реализации:

  • интерфейсом является то, что должно быть не инстанциируемым но инстанциируемыми в вашем случае (потому что есть даже не один чистый
    виртуальная функция в вашем так называемом интерфейсе) Стандартное правило является
    сделать все функции в интерфейсе чисто виртуальная (= 0)
  • class Sorted не наследует от так называемого интерфейса sortedInterface
  • Вы не определили все версии вашего конструктора в вашем class Sorted
  • Если вы хотите полиморфизм работать (интерфейс к бетону), вы
    должны иметь деструкторов виртуального класса как в интерфейсе и
    конкретный класс
Смежные вопросы