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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 5.00
Ktulu
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 17
#1

Шаблон бинарного дерева - C++

09.05.2011, 15:11. Просмотров 2723. Ответов 9
Метки нет (Все метки)

Здравствуйте.
Есть одна проблема и не получается её решить, надеюсь вы поможите. Делаю шаблон бинарного дерева. По сути сделал только вставку и решил проверить работает ли она, но при создании объекта появляется ошибка
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
#pragma once
#include <iostream>
using namespace std;
 
template <class T>
struct Elem
    {
        T info;
        Elem<T> *left, *right;
    };
template <class T>
class BinTree
{   
private:
    Elem<T>*root;   
public: 
    BinTree(void);
    ~BinTree(void);
    BinTree (const BinTree<T>&Tr);
    void Insert (Elem<T>*&, const T&);
    void Delete (Elem<T>*&, const T&);
    void Copy (Elem<T>*&, Elem<T>*);
    void Print (ostream &out, const Elem<T>*tr) const;
    char* longWay (Elem<T>*&, const T&);
    void MakeEmpty (Elem<T>*&);
    BinTree<T>& operator =(const BinTree <T>&);
    friend istream& operator >> (istream &, BinTree <T>&);
    friend ostream& operator << (ostream &, BinTree <T>&);
 
};
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "StdAfx.h"
#include "BinTree.h"
 
template <class T>
BinTree<T>::BinTree(void)
{
    root=NULL;
}
template <class T>
BinTree<T>::~BinTree(void)
{
 
}
template <class T>
BinTree<T>::BinTree(const BinTree<T> &Tr)
{
 
}
template <class T>
void BinTree<T>::Copy(Elem<T>*&T1, Elem<T>*T2)
{
 
 
}
template <class T>
void BinTree<T>::Delete(Elem<T>*&Tr, const T&x)
{
    
}
template <class T>
void BinTree<T>::Insert(Elem<T>*&Tr, const T&X)
{
    if (Tr)
    {
        if (x<Tr->info)
        {
            Insert (Tr->left, x);
        }
        else (x>Tr->info)
        {
            Insert (Tr->right, x);
        }
    else
    {
        return
    }
            else
            {
                if (!(Tr=new Elem))
                {
                    throw 1;
                    Tr->info=x;
                    Tr->left=Tr->right=0;
                }
            }
    }
 
}
template <class T>
char* BinTree<T>::longWay(Elem<T>*&Tr, const T&x)
{
 
 
}
template <class T>
void BinTree<T>::MakeEmpty(Elem<T>*&)
{
 
}
template <class T>
void BinTree<T>::Print(std::ostream &out, const Elem<T>*tr) const
{
 
}
template <class T>
BinTree<T>&BinTree<T>::operator =(const BinTree<T>&)
{
    
 
}
template <class T>
ostream& operator << (ostream &, BinTree <T>&)
{
 
}
template <class T>
istream& operator >> (istream &, BinTree <T>&)
{
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Kursovoi.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include "str.h"
#include "tochka.h"
#include "BinTree.h"
#include <conio.h>
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    BinTree<char>B1;
 
    getch ();
    return 0;
}
1>Kursovoi.obj : error LNK2019: unresolved external symbol "public: __thiscall BinTree<char>::~BinTree<char>(void)" (??1?$BinTree@D@@QAE@XZ) referenced in function _wmain
1>Kursovoi.obj : error LNK2019: unresolved external symbol "public: __thiscall BinTree<char>::BinTree<char>(void)" (??0?$BinTree@D@@QAE@XZ) referenced in function _wmain

Подскажите, пожалуйста, в чём дело и как исправить проблему.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
613 / 457 / 31
Регистрация: 28.01.2011
Сообщений: 605
09.05.2011, 15:15     Шаблон бинарного дерева #2
Для шаблонов реализация должна находиться в одном файле с объявлениями.
Ktulu
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 17
09.05.2011, 15:24  [ТС]     Шаблон бинарного дерева #3
Извините, но я не совсем понял, я первый раз с шаблонами работаю. То есть должно быть так:
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
#pragma once
#include <iostream>
using namespace std;
 
template <class T>
struct Elem
    {
        T info;
        Elem<T> *left, *right;
    };
template <class T>
class BinTree
{   
private:
    Elem<T>*root;   
public: 
    BinTree(void)
    {
        root=NULL;
    }
    ~BinTree(void);
    BinTree (const BinTree<T>&Tr);
    void Insert (Elem<T>*&, const T&)
{
    if (Tr)
    {
        if (x<Tr->info)
        {
            Insert (Tr->left, x);
        }
        else (x>Tr->info)
        {
            Insert (Tr->right, x);
        }
    else
    {
        return
    }
            else
            {
                if (!(Tr=new Elem))
                {
                    throw 1;
                    Tr->info=x;
                    Tr->left=Tr->right=0;
                }
            }
    }
 
}
    void Delete (Elem<T>*&, const T&);
    void Copy (Elem<T>*&, Elem<T>*);
    void Print (ostream &out, const Elem<T>*tr) const;
    char* longWay (Elem<T>*&, const T&);
    void MakeEmpty (Elem<T>*&);
    BinTree<T>& operator =(const BinTree <T>&);
    friend istream& operator >> (istream &, BinTree <T>&);
    friend ostream& operator << (ostream &, BinTree <T>&);
};
Или я неправильно всё понял?
Ma3a
Эксперт C++
613 / 457 / 31
Регистрация: 28.01.2011
Сообщений: 605
09.05.2011, 15:39     Шаблон бинарного дерева #4
В целом, верно, но вот у вас в Insert с if-else какие-то проблемы непонятные, включая синтаксические ошибки, да и вообще, думается, что работать это не будет. Как минимум, это должно выглядеть так, чтобы скомпилировалось:
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
void Insert (Elem<T>*& Tr, const T& x)
{
    if (Tr)
    {
        if (x<Tr->info)
        {
            Insert (Tr->left, x);
        }
        else (x>Tr->info)
        {
            Insert (Tr->right, x);
        }
    }
    else if (!(Tr=new Elem<T>))
        {
            throw 1;
            Tr->info=x;
            Tr->left=Tr->right=0;
        }
    else
    {
        return;
    }
}
думайте над алгоритмом вставки, а то у вас тут что-то не то.
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
09.05.2011, 15:43     Шаблон бинарного дерева #5
столкнулся с той же проблемой когда делал шаблонный клас впервые...
в одном файле должна быть и обьявления и реализация , ты же просто обьявил функции в

Цитата Сообщение от Ktulu Посмотреть сообщение
void Delete (Elem<T>*&, const T&);
void Copy (Elem<T>*&, Elem<T>*);
void Print (ostream &out, const Elem<T>*tr) const;
char* longWay (Elem<T>*&, const T&);
void MakeEmpty (Elem<T>*&);
BinTree<T>& operator =(const BinTree <T>&);
friend istream& operator >> (istream &, BinTree <T>&);
friend ostream& operator << (ostream &, BinTree <T>&)
допиши реализацию... чуть ниже за пределами класса
[/CPP]
и ещо исправь френд функию перегрузки операторов она ведь тоже шаблонной должна быть... а то потом замучаешся
Ktulu
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 17
09.05.2011, 15:45  [ТС]     Шаблон бинарного дерева #6
Спасибо, я подумаю получше, но есть проблемы, программа до сих пор не работает

1>Kursovoi.obj : error LNK2019: unresolved external symbol "public: __thiscall BinTree<char>::~BinTree<char>(void)" (??1?$BinTree@D@@QAE@XZ) referenced in function _wmain
1>C:\Documents and Settings\user\Мои документы\Visual Studio 2005\Projects\Kursovoi\Debug\Kursovoi.exe : fatal error LNK1120: 1 unresolved externals

И вопрос, что тогда писать в cpp. файле?
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
09.05.2011, 15:47     Шаблон бинарного дерева #7
ничего не надо там писать , только в файле с мейном подлючи свой файл с класом
рано тебе ещо компилировать его, ругаетса он потому что нет деструктора реализированого, и напиши конструктор копирования тогда будеш тестировать
Ma3a
Эксперт C++
613 / 457 / 31
Регистрация: 28.01.2011
Сообщений: 605
09.05.2011, 15:48     Шаблон бинарного дерева #8
Вы не описали внутренности деструктора, допишите в объявлении
C++
1
2
3
~BinTree()
{
}
И ещё: не принято в c++ при отсутствии параметров писать void, лучше просто пишите пустые скобки.
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
09.05.2011, 15:51     Шаблон бинарного дерева #9
желательно конешно оформить конструторы и все функции не в самом классе ,а вот так
C++
1
2
3
4
template<class T>  BinTree<T>::BinTree(void)
{
...........................реализация............
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2011, 16:00     Шаблон бинарного дерева
Еще ссылки по теме:

Написать шаблон бинарного дерева с функцией распечатки дерева C++
C++ Высота бинарного дерева
C++ Запись бинарного дерева
Глубина бинарного дерева C++
Балансировка бинарного дерева C++

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

Или воспользуйтесь поиском по форуму:
Ktulu
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 17
09.05.2011, 16:00  [ТС]     Шаблон бинарного дерева #10
Спасибо вам за советы, вроде бы стало более-менее понятно, будем продолжать думать
Yandex
Объявления
09.05.2011, 16:00     Шаблон бинарного дерева
Ответ Создать тему
Опции темы

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