Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

Реализуйте АТД “Список” для любого типа данных - C++
Помогите решить задачку. 1. Реализуйте АТД “Список” для любого типа данных и его операторы (INSERT, LOCATE, RETRIEVE, DELETE, NEXT,...

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

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

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

Цитата Сообщение от insolent Посмотреть сообщение
Mee, для любого строкового? или вообще любого типа?
Как вариант:
1) TCHAR
2) void *s
для любого строкового, и подробней, пожалуйста
0
LosAngeles
Заблокирован
29.08.2011, 13:32 #5
Цитата Сообщение от Mee Посмотреть сообщение
А если будут еще типы, еще несколько раз парезагружать?
а какие "ещё"? char и wchar_t перегрузи норм будет, хотя довольно странно, в стл как бы две различные специализации basic_stream есть wstring и string ты их чтоли скрестить пытаешься? Сделай две специализации и не парься
0
rangerx
1937 / 1546 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
29.08.2011, 13:41 #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 = _(""));
0
Mee
14 / 14 / 1
Регистрация: 05.07.2010
Сообщений: 88
29.08.2011, 13:46  [ТС] #7
задание такое стоит, вот и парюсь
0
LosAngeles
Заблокирован
29.08.2011, 13:51 #8
в vs если чё есть макрос _Т()
0
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
30.08.2011, 11:50 #9
Mee, перегрузи конструктор, как рекомендовал LosAngeles
C++
1
2
3
4
5
6
class String
{
    String(const char*);
    String(const wchar_t*);
    // добавляй типы, которые тебе нужно
};
TCHAR зависит от настройки макроса Unicode
0
rangerx
1937 / 1546 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
30.08.2011, 12:09 #10
Цитата Сообщение от insolent Посмотреть сообщение
перегрузи конструктор, как рекомендовал LosAngeles
Как-то я слабо себе представляю, каким образом он будет дальше с этим работать...
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
31.08.2011, 01:59 #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.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
31.08.2011, 13:38 #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;
}
0
31.08.2011, 13:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 13:38
Привет! Вот еще темы с ответами:

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

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

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

Напишите функцию Swap(a, b), аргументами которой могут быть числа любого типа - C++
Напишите функцию Swap(a, b), аргументами которой могут быть числа любого типа. Функция меняет значения своих аргументов и не возвращает...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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