Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонный класс список 
:(
    Опции темы
Ghost555
Дата 21.4.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



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

Код

#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 глобально, либо я не знаю как сделать.
Посоветуйте пожалуйста!

Это сообщение отредактировал(а) Ghost555 - 21.4.2007, 16:54
PM MAIL   Вверх
Xenon
Дата 21.4.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



[UPDATE] Пардон, не доглядел

Это сообщение отредактировал(а) Xenon - 21.4.2007, 16:58


--------------------
user posted image  
PM MAIL   Вверх
archimed7592
Дата 21.4.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ghost555
Дата 24.4.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



Ну так как всё таки обратиться к списку из какой-нибудь функции в гланом файле main.cpp?
PM MAIL   Вверх
archimed7592
Дата 24.4.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.