Форум программистов, компьютерный форум CyberForum.ru

Дек-шаблон - C++

Восстановить пароль Регистрация
 
krautcat
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 4
22.05.2014, 01:34     Дек-шаблон #1
Доброй ночи.
У меня вопрос.
Я хочу реализовать дек, а потом на его основе сделать шаблон. В деке могут храниться как числа, так и строки. Я попытался реализовать через промежуточный класс. На этапе компиляции выводит ошибку LNK2019.
Где именно ошибка, я не знаю.
Очень хочу услышать дельные советы по реализации дека-шаблона.

Объявление классов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "stdafx.h"
#include <string.h>
#include <stdlib.h>
#include <iostream>
 
#ifndef my_classes
#define my_classes
 
using namespace std;
 
class CInteger
{
public:
    int value;
    CInteger () {value=0;};
    CInteger (int param) { value = param; };
    void Out () {cout << value << endl;}
};
class CString
{
public:
    char *value;
    CString (char *param) {value=new char [strlen(param)+1]; value[0]='\0'; strcpy(value, param);};
    ~CString () {delete[] value;};
    void Out () {cout << value << endl;}
};
 
template <class type>
class CElement
{
public:
    type value;
    type *next;
    type *prev;
    CElement<type> (char *param, type *previous, type *next);
    ~CElement<type> (); 
};
 
template <class deque>
class CDeque
{
private:
    CElement<deque> *first;
    CElement<deque> *last;
public:
    CDeque<deque> (char *param);
    ~CDeque<deque> ();
    void PushBack (char *param);
    void PushFront (char *param);
    void Delete (char *param);
    void Out ();
    char* StringOut ();
};
 
template <class type>
class CDeque_Sort: public CDeque <type>
{
public:
    void MergeSort ();
}
 
#endif my_classes

Описание методов
[СPP]#include "stdafx.h"
#include "my_classes.h"
#include <string.h>

;
template <class type> CElement<type>::CElement (char *param, type *previous, type *next)
{
if (typename == CString)
this->value = CString (param);
if (typename == CInteger)
this->value = CInteger (atoi(param));
this->prev = previous;
this->next = next;
};
template <class type> CElement<type>::~CElement ()
{
delete[] this->prev;
delete[] this->next;
this->value.~type();
};

template <class deque> CDeque<deque>::CDeque (char *param)
{
int counter, co_sp=0, j = 0;
char value [300];
type = deque;
CElement<type> *iterator;
CElement<type> *neu;

this->first = this->last = NULL;

for (counter=0; counter<strlen(param))
if (param[counter]==' ')
co_sp++;
if (param[strlen(param)]!=' ')
co_sp++;

for (counter=0; counter<strlen(param))
{
if (param[counter]==' ')
{
if (this->first = NULL)
{
iterator = new CElement<type> (value, NULL, NULL);
this->first = iterator;
neu = first;
}
else
{
neu = NULL;
neu = new CElement<type> (value, NULL, NULL)
neu->prev = iterator;
iterator->next = neu;
iterator = neu;
}
j = 0;
}
else
{
value[j] = param[counter];
j++;
value[j] = '\0';
}
}
this->last = iterator;
};
template <class deque> void CDeque<deque>::Out ()
{
type = deque;
CElement<type> *iterator = this->first;
while (iterator->next != NULL)
{
iterator->value.Out();
iterator = iterator->next;
}
};
[/CPP]

Основная программа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Лабораторная работа 8.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "my_classes.h"
 
 
;int _tmain(int argc, _TCHAR* argv[])
{
    char *temp = new char [300];
    cin.getline(temp, 300);
    CDeque<CString> A (temp);
    A.Out();
    
    system("pause");
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2014, 01:34     Дек-шаблон
Посмотрите здесь:

Полный дек C++
дек C++
дек через список C++
Очередь и дек С++ C++
C++ Простой дек
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.05.2014, 02:03     Дек-шаблон #2
Цитата Сообщение от krautcat Посмотреть сообщение
На этапе компиляции выводит ошибку LNK2019.
Где именно ошибка, я не знаю.
текст ошибки сюда выложить, корона упадет?
krautcat
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 4
22.05.2014, 02:08  [ТС]     Дек-шаблон #3
Цитата Сообщение от Jupiter Посмотреть сообщение
текст ошибки сюда выложить, корона упадет?
Прошу прощения.

C++
1
2
3
Error   1   error LNK2019: unresolved external symbol "public: __thiscall CDeque<class CString>::~CDeque<class CString>(void)" (??1?$CDeque@VCString@@@@QAE@XZ) referenced in function _wmain
Error   2   error LNK2019: unresolved external symbol "public: void __thiscall CDeque<class CString>::Out(void)" (?Out@?$CDeque@VCString@@@@QAEXXZ) referenced in function _wmain
Error   3   error LNK2019: unresolved external symbol "public: __thiscall CDeque<class CString>::CDeque<class CString>(char *)" (??0?$CDeque@VCString@@@@QAE@PAD@Z) referenced in function _wmain
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.05.2014, 02:24     Дек-шаблон #4
а где описание ~CDeque ?
krautcat
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 4
22.05.2014, 02:32  [ТС]     Дек-шаблон #5
Цитата Сообщение от Jupiter Посмотреть сообщение
а где описание ~CDeque ?
Я его пока не сделал, of course.
Сейчас пытался сделать без промежуточного класса. Пока тоже безуспешно.
Отпишусь после написания деструктора.

Аналогичная ошибка. Деструткор описан.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
22.05.2014, 03:08     Дек-шаблон #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
krautcat, у тебя ошибка в логике. Где, подсказывать не буду, т.к. оно и так очень заметно.
Если хочешь оптимизировать немного по скорости делай на массивах, скажем по 10 элементов.

Задания на стеки/очереди (без шаблонных классов stack, queue) тут моя недавняя реализация стека на массивах (в этом случае массив каждый раз перевыделяется, а тебе надо доделать что-бы он состоял из множества частей).

Если сделаешь на массивах получишь усложнение логики для их поддержки, но увеличится производительность на частых операциях добавления, удаления элементов, так как память под него выделять не надо будет (она уже будет выделена). Частые операции выделения памяти сильно тормозят. Да и те же move constructable & move assigneable интерфейсы поддерживать проще будет.
krautcat
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 4
22.05.2014, 03:17  [ТС]     Дек-шаблон #7
Цитата Сообщение от outoftime Посмотреть сообщение
Если хочешь оптимизировать немного по скорости делай на массивах, скажем по 10 элементов.
По заданию - дек. Вот и моделирую.

Буду копать в сторону логики тогда.

Добавлено через 1 минуту
Цитата Сообщение от outoftime Посмотреть сообщение
Где, подсказывать не буду, т.к. оно и так очень заметно.
Хотя бы направление, куда копать... На самом деле, я в шаблонах не шарю практически.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2014, 11:53     Дек-шаблон
Еще ссылки по теме:

C++ Дек в виде массива
Дек символов C++
Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
22.05.2014, 11:53     Дек-шаблон #8
Цитата Сообщение от krautcat Посмотреть сообщение
На самом деле, я в шаблонах не шарю практически.
Цитата Сообщение от krautcat Посмотреть сообщение
Буду копать в сторону логики тогда.
В сторону логики а не семантики.
Yandex
Объявления
22.05.2014, 11:53     Дек-шаблон
Ответ Создать тему
Опции темы

Текущее время: 08:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru