• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Не могу вынести описание класса в h

  • Автор темы Guest_Docent
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest_Docent

Пишу на билдере 6. Нужно мне сделать класс который будет хранить значения некоторых сваойств. Написал как полагается: декларация в h, реализация в cpp. Делаю попытку использовать свой класс из другого модуля, подключая заголовочный файл пишет:

Build

  [Linker Error] Unresolved external 'TPropertyList<int>::~TPropertyList<int>()' referenced from C:\PROGRAM FILES\CBUILDER6\PROJECTS\PROPERTYLIST\UNIT1.OBJ

  [Linker Error] Unresolved external 'TPropertyList<int>::TPropertyList<int>()' referenced from C:\PROGRAM FILES\CBUILDER6\PROJECTS\PROPERTYLIST\UNIT1.OBJ

  [Linker Error] Unresolved external 'TPropertyList<int>::eek:perator [](System::AnsiString)' referenced from C:\PROGRAM FILES\CBUILDER6\PROJECTS\PROPERTYLIST\UNIT1.OBJ

Если объеденить декларацию с реализацией в cpp (как в прикрепленной файле), то все работает как надо.

Подскажите я что-то не так делаю????

текст:

Код:
//---------------------------------------------------------------------------


#pragma hdrstop

#include <Classes.hpp>
//#include "PropertyList.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

template <class T>
struct TProperty {
 AnsiString Name;
 T Value;
};

template <class T>
class TPropertyList
{
private:
  TList * FList;
  int Add(AnsiString Name, T Value);
  int IndexOf(AnsiString Name);
public:
  TPropertyList ();
  ~TPropertyList ();
  T & operator[](AnsiString Name);
};


template <class T>
int TPropertyList<T>::Add(AnsiString Name, T Value)
{
 TProperty<T> * newp = new TProperty<T>;

 newp->Name = Name;
 newp->Value = Value;

 return FList->Add((void *)newp);
}

//---------------------------------------------------------------------------
template <class T>
int TPropertyList<T>::IndexOf(AnsiString Name)
{
 for (int i=0; i<FList->Count; i++) {
   if (((TProperty<T> *)FList->Items[i])->Name == Name) return i;
 }

 return -1;
}

//---------------------------------------------------------------------------
template <class T>
TPropertyList<T>::TPropertyList ()
{
 FList = new TList;
}

//---------------------------------------------------------------------------
template <class T>
TPropertyList<T>::~TPropertyList ()
{
 FList->Free();
}

//---------------------------------------------------------------------------
template <class T>
T & TPropertyList<T> :: operator[](AnsiString Name)
{
 T * newv = new T;

 int index = (IndexOf(Name));
 if (index == -1) index = Add(Name, *newv);

 return ((TProperty<T> *)FList->Items[index])->Value;
}
//---------------------------------------------------------------------------
 
D

Dr.Gigabit

Написал как полагается

С шаблонами так не полагается:) Дело в том, что компилятор не выделяет память сразу, а ждет создания экземпляра шаблона. В этом случае, лучше всего хранить в заголовочных файлах и объявления и определения шаблонов.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!