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

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

Войти
Регистрация
Восстановить пароль
 
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
#1

Стрoкa элeмeнтов любого типа - C++

29.08.2011, 12:06. Просмотров 550. Ответов 11
Метки нет (Все метки)

Нужно сделать строку для роботы с любым типом, например написать
C++
1
typеdеf chаr Chаracter
.
В конструкторе по умолчанию аргументы я записал как
C++
1
String(const Character * s = "")
, но в случае, если работаем с wchаr_t, то такое преобразование не прохожит, подскажите как можзно сделать аргумент по умолчанию подходящий для любого типа
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2011, 12:06     Стрoкa элeмeнтов любого типа
Посмотрите здесь:

Шифрование любого типа данных - C++
Всем привет у меня вопрос по теории. Написал консольное приложение которое изначально как я предполагал будет способно зашифровать текст...

Обработка нетипизированных(любого типа) файлов - C++
Разработать программу на языке С++: осуществляющую обработку нетипизированных(любого типа) файлов и вывести на экран. подскажите, как это...

Объявление функции, принимающей объект любого типа - C++
Доброго времени суток. Мне нужна функция, которая будет принимать 3 объекта функции как критерии сортировки. Все три критерия могут быть...

Записать в память и хранить в ней данные любого типа - C++
Добрый день. Разбираюсь с типами данных в С++. В частности каким образом осуществляется преобразование типов данных. Сделал программу. Идея...

Создать указатель, который сможет указывать объект любого типа. - C++
Привет всем, я в програмировании ни чего не смыслю поэтому обращаюсь к вам, помогите составить программу, желательно для Visual studio 10....

Написать шаблонную функцию, для обработки матриц любого типа - C++
Написать ф-цию по матрицам,превратить в шаблон с тем,чтобы ф-ция обрабатывала матрицу любого типа.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
29.08.2011, 12:52     Стрoкa элeмeнтов любого типа #2
Mee, для любого строкового? или вообще любого типа?
Как вариант:
1) TCHAR
2) void *s
LosAngeles
Заблокирован
29.08.2011, 13:06     Стрoкa элeмeнтов любого типа #3
перегрузи конструктор
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
29.08.2011, 13:09  [ТС]     Стрoкa элeмeнтов любого типа #4
Цитата Сообщение от LosAngeles Посмотреть сообщение
перегрузи конструктор
А если будут еще типы, еще несколько раз парезагружать?

Цитата Сообщение от insolent Посмотреть сообщение
Mee, для любого строкового? или вообще любого типа?
Как вариант:
1) TCHAR
2) void *s
для любого строкового, и подробней, пожалуйста
LosAngeles
Заблокирован
29.08.2011, 13:32     Стрoкa элeмeнтов любого типа #5
Цитата Сообщение от Mee Посмотреть сообщение
А если будут еще типы, еще несколько раз парезагружать?
а какие "ещё"? char и wchar_t перегрузи норм будет, хотя довольно странно, в стл как бы две различные специализации basic_stream есть wstring и string ты их чтоли скрестить пытаешься? Сделай две специализации и не парься
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
29.08.2011, 13:41     Стрoкa элeмeнтов любого типа #6
Обычно делается приблизительно вот так
C++
1
2
3
4
5
#ifdef UNICODE
    typedef wchar_t Chаracter;
#else
    typedef char Chаracter;
#endif
C++
1
2
3
4
5
#ifdef UNICODE
  #define _(s) L ## s
#else
  #define _(s) s
#endif
C++
1
String(const Chаracter* s = _(""));
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
29.08.2011, 13:46  [ТС]     Стрoкa элeмeнтов любого типа #7
задание такое стоит, вот и парюсь
LosAngeles
Заблокирован
29.08.2011, 13:51     Стрoкa элeмeнтов любого типа #8
в vs если чё есть макрос _Т()
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
30.08.2011, 11:50     Стрoкa элeмeнтов любого типа #9
Mee, перегрузи конструктор, как рекомендовал LosAngeles
C++
1
2
3
4
5
6
class String
{
    String(const char*);
    String(const wchar_t*);
    // добавляй типы, которые тебе нужно
};
TCHAR зависит от настройки макроса Unicode
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
30.08.2011, 12:09     Стрoкa элeмeнтов любого типа #10
Цитата Сообщение от insolent Посмотреть сообщение
перегрузи конструктор, как рекомендовал LosAngeles
Как-то я слабо себе представляю, каким образом он будет дальше с этим работать...
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
31.08.2011, 01:59     Стрoкa элeмeнтов любого типа #11
Цитата Сообщение от Mee Посмотреть сообщение
подскажите как можзно сделать аргумент по умолчанию подходящий для любого типа
Шаблоны.

Я представляю себе это как-то так:

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
 
template <typename T>
class CStr
{
protected:
    T * bufPtr;
    size_t bufSize;
 
public:
    CStr( )
    {
        bufSize = 0;
        bufPtr = 0;
    }
 
    CStr( T * src )
    {
        bufSize = 0;
        bufPtr = 0;
 
        *this = src;
    }
 
    CStr( CStr& src )
    {
        bufSize = 0;
        bufPtr = 0;
 
        *this = src;
    }
 
    ~CStr()
    {
        if( bufPtr )
           free( bufPtr );
    }
 
    size_t size( T * str )
    {
        size_t i = 0;
 
        while( str[i] != 0 )
           i++;
 
        return i;
    }
 
    size_t size( )
    {
        return bufSize;
    }
 
    void clear()
    {
        if( !bufPtr )
           return;
 
        bufPtr = (T*)realloc( bufPtr, 0 );
        bufSize = 0;
    }
 
    CStr & operator=( CStr& str )
    {
        bufPtr = (T*)realloc( bufPtr, str.size() + 1 );
        bufSize = str.size();
 
        for( size_t i = 0; i < str.size(); i++ )
           bufPtr[i] = str[i];
 
        bufPtr[ bufSize ] = 0;
 
        return *this;
    }
 
    CStr & operator=( T * str )
    {
        size_t lng = size(str);
 
        bufPtr = (T*)realloc( bufPtr, lng + 1 );
        bufSize = lng;
 
        for( size_t i = 0; i < lng; i++ )
           bufPtr[i] = str[i];
 
        bufPtr[ lng ] = 0;
 
        return *this;
    }
 
    CStr & operator=( T c )
    {
        bufPtr = (T*)realloc( bufPtr, 2 );
        bufSize = 1;
 
        *bufPtr = c;
        bufPtr[ 1 ] = 0;
 
        return *this;
    }
 
    T& operator[] ( size_t pos )
    {
        return bufPtr[pos];
    }
 
    CStr& operator+= ( CStr& str )
    {
        size_t lng = bufSize + str.size();
 
        bufPtr = (T*)realloc( bufPtr, lng + 1 );
 
        for( size_t i = 0; i < str.size(); i++ )
           bufPtr[ i + bufSize ] = str[i];
 
        bufPtr[lng] = 0;
        bufSize = lng;
 
        return *this;
    }
 
    CStr& operator+= ( T * str )
    {
        size_t str_lng = size( str );
        size_t lng = bufSize + str_lng;
 
        bufPtr = (T*)realloc( bufPtr, lng + 1 );
 
        for( size_t i = 0; i < str_lng; i++ )
           bufPtr[ i + bufSize ] = str[i];
 
        bufPtr[lng] = 0;
        bufSize = lng;
 
        return *this;
    }
 
    CStr& operator+= ( T c )
    {
        bufSize++;
        bufPtr = (T*)realloc( bufPtr, bufSize + 1 );
 
        bufPtr[bufSize - 1] = c;
        bufPtr[bufSize] = 0;
 
        return *this;
    }
 
    const T * data()
    {
        return bufPtr;
    }
};
 
template <typename T>
ostream & operator<< ( ostream &os, CStr<T> & str )
{
    for( size_t i = 0; i < str.size(); i++ )
       os << str[i];
 
    return os;
}
 
int main()
{
    CStr<char> str( "hello" );
    CStr<char> str2( "goodbye" );
 
    cout << "Initial:\n" << str << '\n' << str2 << '\n';
    cout << "str += \" mayday\": " << (str += " mayday") << '\n';
    cout << "str += str2: " << (str += str2) << '\n';
    cout << "str = str2: " << (str = str2) << '\n';
    str.clear();
    cout << "str.clear(): " << str << '\n';
 
    return 0;
}
При выводе тут всё упирается в умение std::ostream работать с элементом заданного типа. Можно так же прикрутить istream & operator>>( istream &is, CStr<T> &str );, но я затрудняюсь прочитать элементы типа T из is, итераторы (было бы интересно узнать, как их делать)... Однако, всё это уже есть в basic_stream.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 13:38     Стрoкa элeмeнтов любого типа
Еще ссылки по теме:

Напишите шаблон класса односвязного списка, который принимает элементы любого типа - C++
Ребята, помогите. Надо решить следующую задачу: Напишите шаблон класса односвязного списка, который принимает элементы любого типа. ...

Реализовать класс MyQueue, позволяющий хранить данные любого типа в виде очереди - C++
Здравствуйте уважаемые форумчане, помогите с задачей на шаблоны 1. Реализовать класс MyQueue, позволяющий хранить данные любого типа в...

как написать программу, к примеру, класс шаблон выводящая дин. массив любого типа, с конструктором и деструктором... - C++
Доброго всем времени суток! Очень заинтересовался этим языком, но не все получается. Вот как написать программу, к примеру, класс шаблон...

Записать программу, содержащую шаблон функции, возвращающей сумму квадрата и куба числа любого числового типа - C++
Записать программу, содержащую шаблон функции, возвращающей сумму квадрата и куба числа любого числового типа Помогите пожалуйста!!! Буду...


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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
31.08.2011, 13:38     Стрoкa элeмeнтов любого типа #12
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
template<class T>
class String;
 
template<> 
class String<char>
{
public:
   String(const char* ptr);
   const char* c_str() const {return pointer;}
private:
   char* pointer;
};
 
template<>
class String<wchar_t>
{
public:
   String(const wchar_t* ptr);
   const wchar_t* c_str() const {return pointer;}
private:
   wchar_t* pointer;
};
 
template<class Char>
std::basic_ostream<Char>& operator <<(std::basic_ostream<Char>& stream, const String<Char>& obj)
{
    stream << obj.c_str() << std::endl;
    return stream;
}
Yandex
Объявления
31.08.2011, 13:38     Стрoкa элeмeнтов любого типа
Ответ Создать тему
Опции темы

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