Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Шаблонный класс список


Автор: Ghost555 21.4.2007, 16:51
Всем здравстуйте! 
Я почти разобрался, но существует небольшая проблема. Необходимо создать список, каждый элемент которого содержит массив указателей на данные. Данные вводит пользователь с клавиатуры.
Вот заголовочный файл с описанием классов:

Код

#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <windows.h>

#define P 2

int K=1;
char str[500];
char In[500];
bool ph=false;
//-----------------------------------------------------------------
//-----------------------------------------------------------------
template <class T> class Node;
template <class T> class List;
//-----------------------------------------------------------------
        //Класс Node (узел списка)
//-----------------------------------------------------------------
template <class T> class Node
{
private:
    Node<T>* Next;
    T** Data;

public:
    Node();

friend class List<T>;
};
//-----------------------------------------------------------------
template <class T> Node<T>::Node()
{
    Next=NULL;
    Data=new T*[K*P];
    for (int i=0; i<K*P; Data[i]=NULL, i++);
    K*=2;
}
//-----------------------------------------------------------------
        //Класс List (хранитель "головы" и функций над списком)
//-----------------------------------------------------------------
template <class T> class List
{
public:
    Node<T>* Head;
    List() {Head=NULL;}
    void AddElem(T*);
    void Add(T*, Node<T>*);
                void GetData();
};
//-----------------------------------------------------------------
template <class T> void List<T>::AddElem(T* temp)
{
    Node<T>* current = Head;
    Node<T>* prev = current;
    Node<T>* q;
    while(current)
    {
        prev=current;
        current=current->Next;
    }
    q=new Node<T>;
    ph=true;
    if (prev)
        prev->Next=q;
    else
        Head=q;
    Add(temp, q);
}
//-----------------------------------------------------------------
template <class T> void List<T>::Add(T* temp, Node<T>* q)
{
    q->Data[0]=temp;
}
//-----------------------------------------------------------------
void List<char>::Add(T* temp, Node<char>* q)
{
    q->Data[0]=new char[strlen(temp)+1];
    strcpy(q->Data[0],temp);
}
//-----------------------------------------------------------------
template <class T> void List<T>::GetData()
{
    Node<T>* current=Head;
    int k=1;
    while (current)                 
    {
        for(int i=0; i<k*P; i++)
        {
            cout << current->Data[i];
        }
        current=current->Next;
    }
}


И есть файл main.cpp. Ну здесь не полная его часть, а самое главное, что вызывает вопрос:

Код

#include "header.h"
void Check(char*);
void main()
{
                printf("Введите значение элемента: ");
                cin >> In;
                Check(In);
                printf("\nВы ввели: ");
                PH.GetData();                 //ВОТ ЗДЕСЬ И ОШИБКА
}
//-----------------------------------------------------------------
void Check(char* In)
{
    if (atof(In))
    {
        if (atof(In)-atoi(In))
        {
            List<float> PH;
            PH.AddElem(atof(In));
        }
        List<int> PH;
        PH.AddElem(atoi(In);
    }
    else
    {
        List<char> PH;
        PH.AddElem(In);
    }
}


В этом и вопрос, как сделать, чтобы можно было либо объявить PH глобально, либо я не знаю как сделать.
Посоветуйте пожалуйста!

Автор: Xenon 21.4.2007, 16:57
[UPDATE] Пардон, не доглядел

Автор: archimed7592 21.4.2007, 17:15
Цитата(Ghost555 @  21.4.2007,  16:51 Найти цитируемый пост)
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <math.h>
<cstring>/<string> - разные вещи...
<iostream>
<cmath>
и using namespace std/using std::something/std::something в коде

Цитата(Ghost555 @  21.4.2007,  16:51 Найти цитируемый пост)
if (atof(In)-atoi(In))
опасная проверочка...

ну а по теме: boost::any/boost::variant/собственная реализация универсального holder'а...

Добавлено через 3 минуты и 4 секунды
зы. если задача не состоит в том, чтобы реализовать свой список, то можно юзать std::list, который намного более функциональный и шустрый smile

Автор: Ghost555 24.4.2007, 12:19
Ну так как всё таки обратиться к списку из какой-нибудь функции в гланом файле main.cpp?

Автор: archimed7592 24.4.2007, 14:01
Ghost555, PH - локальный объект. он уничтожается как только выполнение ф-ции Check заканчивается (а то и во время выполнения).
делай PH глобальной переменной, но учти, что она будет определённой специализации (либо int, либо float, либо char)... либо делай 3 глобальных переменных... либо используй boost::any/boost::variant

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)