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

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

Войти
Регистрация
Восстановить пароль
 
 
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
#1

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

24.07.2014, 15:55. Просмотров 639. Ответов 16
Метки нет (Все метки)

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
//класс одномерный массив
template<typename T>class ARRAY1{
public:
    T*pointer;
    double size;
    ARRAY1(){
        pointer=0;//пустой массив.
        size=0;
    }
    ARRAY1(double n){
        pointer=new T[n];//незаполненный массив размера"н"
        size=n;
    }
    ARRAY1(T* p,double n){
        pointer=new T[n];//инициализировать стандартным массивом
        size=n;
        for(double i=0;i<size;i++){
            pointer[i]=p[i];
        }
    }
    ARRAY1(ARRAY1 & obj){
        pointer=new T[obj.size];//констуктор копирования
        size=obj.size;
        for(double i=0;i<size;i++){
            pointer[i]=obj.pointer[i];
        }
    }
    ARRAY1(double n,T a,...){
        pointer=new T[n];//инициализировать набором элементов
        size=n;
        for(double i=0;i<size;i++){
            pointer[i]=(&a)[i];
        }
    }
    ~ARRAY1(){
        delete[]pointer;//деструктор
    }
    T & operator[](double i){
        return pointer[i];//элемент массива №"ай"
    }
};
template<typename T>ARRAY1 & <T>operator=(ARRAY1 & <T>a,ARRAY1<T>b){
    a.pointer=new T[b.size];//операция пресваивания
    a.size=b.size;
    for(double i=0;i<a.size;i++){
        a[i]=b[i];
    }
    return a;
}
template<typename T>bool operator==(ARRAY1<T>a,ARRAY1<T>b){
    bool B=(a.size==b.size);//проверка равенства
    for(double i=0;i<a.size&&!B;i++){
        B&=(a[i]==b[i]);
    }
    return B;
}
template<typename T>ARRAY1 & <T>REDIM(ARRAY1 & <T>a,double n){
    ARRAY1<T>b=a;//изменение размеров масива"а"на"н"элементов
    a=ARRAY1();
    for(i=0;i<a.size&&i<b.size){
        a[i]=b[i]
    }
    return a;
}
template<typename T>ARRAY1 & <T>Redim(ARRAY1 & <T>a,double n){return REDIM(a,a.size+n);}//увиличение(уменьшение)размера массива"а"на"н"элементов
template<typename T>ARRAY1<T>operator+(ARRAY1<T>a,ARRAY1<T>b){
    ARRAY1<T>c=a;//сцепление массивов
    REDIM(c,a.size+b.size);
    for(double i=a.size;i<c.size;i++){
        c[i]=b[i-a.size];
    }
    return c;
}
template<typename T>ARRAY1 & <T>operator+=(ARRAY1 & <T>a,ARRAY1<T>b){a=a+b;return a;}
template<typename T>ARRAY1<T>operator*(ARRAY1<T>a,double b){
    ARRAY1<T>c;
    for(double i=1;i<=b;i++){
        c+a;
    }
    return c;
}
template<typename T>ARRAY1<T>MID(ARRAY1<T>a,double start,double end){
    ARRAY1<T>b(end-start+1);//часть массива начиная от"старт"до"энд"
    for(double i=start;i<=end;i++){
        b[i]=a[i];
    }
return b;
}
template<typename T>ARRAY1<T>Mid(ARRAY1<T>a,double start,double size){return MID(a,start,start+size-1);}//часть массива начиная от"старт"длиной"сайз"
template<typename T>double INSTR(ARRAY1<T>a,T element,double N){
    double n=-1;//нахождение"н"-ой позиции элемента"элемент"
    double i=0;
    for(;i<a.size&&n!=N;i++){
        if(a[i]==element){n++;}
    }
return (n+1?-1:i);
}
template<typename T>Tdouble INSTR(ARRAY1<T>a,ARRAY1<T>b,double N){
    double n=-1;//нахождение"н"-ой позиции части массива"б"
    double i=0;
    for(;i<a.size||n!=N;i++){
        if(Mid(a,i,b.size)==b){n++;}
    }
return (n+1?-1:i);
}
 
template<typename T>ARRAY1<T> REPLACE(ARRAY1<T>a,T e1,T e2){
    ARRAY1<T>b=a;//замена всех элементов массива"а" "е1"на"е2"
    double n=-1;
    for(double i=0;INSTR(b,e1,i)+1;i++){
        b=Mid(b,INSTR(b,e1,i),e1.size)+ARRAY1(1,T e2)+MID(b,INSTR(b,e1,i)+e1.size-1,b.size-1);
    }
return b;
}
template<typename T>ARRAY1<T> REPLACE(ARRAY1<T>a,ARRAY1<T>e1,ARRAY1<T>e2){
    ARRAY1<T>b=a;//замена всех частей массива"а" "е1"на"е2"
    double n=-1;
    for(double i=0;INSTR(b,e1,i)+1;i++){
        b=Mid(b,INSTR(b,e1,i),e1.size)+e2+MID(b,INSTR(b,e1,i)+e1.size-1,b.size-1);
    }
return b;
}
//класс н-мерный массив
template<typename T>class ARRAYnD{
public:
    T*pointer;
    ARRAY1<double>size;
    ARRAYnD(){
        pointer=0;//пустой массив
        size=<double>ARRAY();
    }
    ARRAYnD(ARRAY1<double>sz){
        double size1=1;for(int i;i<sz.size;i++){size1*=sz[i];}//не заполенный массив
        pointer=new T[PRO(i=0,i<sz.size,i++,double,(sz[i]))];
        size=sz;
    }
    ARRAYnD(T* p,ARRAY1<double>sz){
        double size1=1;for(int i;i<sz.size;i++){size1*=sz[i];}//инициализация стандартным массивом
        pointer=pointer=new T[size1];
        size=sz;
        for(double i=0;i<size1;i++){
            pointer[i]=p[i];
        }
    }
    ARRAYnD(ARRAYnD & obj){
        double size1=1;for(int i;i<sz.size;i++){size1*=sz[i];};//конструктор копирования
        pointer=new T[size1];
        size=obj.size;
        for(double i=0;i<size1;i++){
            pointer[i]=obj.pointer[i];
        }
    }
    ARRAYnD(ARRAY1<double>sz,T a,...){
        double size1=1;for(int i;i<sz.size;i++){size1*=sz[i];};//иинициализировать набором элементов
        pointer=new T[size1];
        size=sz;
        for(double i=0;i<size1;i++){
            pointer[i]=(&a)[i];
        }
    }
    ~ARRAYnD(){
        delete[]pointer;//конструктор
    }
    };
но вот проблема, я хочу создать перегруженный оператор[] так штобы если количество измерений массива - 1, возращался элемент типа "T", иначе массив с числом измерений на 1 меньше. Если заметите ошибки в программе пишите буду благодарен.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2014, 15:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции (C++):

Указать тип массива в процессе работы программы - C++
Доброго времени суток, господа! Необходимо создать массив, тип данных которого будет задаваться в зависимости от значения переменной (1, 2...

Прерывание работы функции, если при введенных значения вычисление невозможно - C++
Есть функция типа double, которая возвращает значение выражения. Нужно сделать прерывание функции, если при введенных значения вычислить...

Сортировка в процессе вычислении значения функции - VBA
Здравствуйте. Для эксэля нужна функция, которая будет принимать диапазон и значение, и возвращать значение из этого диопазона, порядковый...

Создать массив строк, чтобы их можно было менять в процессе работы программы - C (СИ)
Как сделать массив из 5 строк, чтобы их можно было менять в процессе работы программы?

Что изменится в процессе загрузки ОС, если в корневом каталоге диска создать файл win.bat? - Администрирование Windows
Укажите назначение файла win.com (и возможных его параметров win.com /? Для ОС Windows 95, 98). Где он размещается? Что изменится в...

4.77. Составить программу для вычисления значения функции у(л): -1, если х < -1, у = х, если х > —1, 1, если х = -1 - C++
4.77. Составить программу для вычисления значения функции у(л): -1, если х &lt; -1, у = х, если х &gt; —1, 1,если х = -1.

16
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.07.2014, 16:04 #2
Справлюсь, не стоит приводить такие простыни кода, если о проблеме можно рассказать и без этого.
Уберите лишнее и приведите вариант Вашей реализации (потенциальной). Так Вам быстрее помогут.
1
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
24.07.2014, 16:27  [ТС] #3
учёл рекомендации Tulosba вот исправленный код
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
//класс одномерный массив
template<typename T>class ARRAY1{
public:
    T*pointer;
    double size;
    ARRAY1(){
        pointer=0;//пустой массив.
        size=0;
    }
    ARRAY1(double n){
        pointer=new T[n];//незаполненный массив размера"н"
        size=n;
    }
    ARRAY1(T* p,double n){
        pointer=new T[n];//инициализировать стандартным массивом
        size=n;
        for(double i=0;i<size;i++){
            pointer[i]=p[i];
        }
    }
    ARRAY1(ARRAY1 & obj){
        pointer=new T[obj.size];//констуктор копирования
        size=obj.size;
        for(double i=0;i<size;i++){
            pointer[i]=obj.pointer[i];
        }
    }
    ARRAY1(double n,T a,...){
        pointer=new T[n];//инициализировать набором элементов
        size=n;
        for(double i=0;i<size;i++){
            pointer[i]=(&a)[i];
        }
    }
    ~ARRAY1(){
        delete[]pointer;//деструктор
    }
    T & operator[](double i){
        return pointer[i];//элемент массива №"ай"
    }
};
template<typename T>ARRAY1 & <T>operator=(ARRAY1 & <T>a,ARRAY1<T>b){
    a.pointer=new T[b.size];//операция пресваивания
    a.size=b.size;
    for(double i=0;i<a.size;i++){
        a[i]=b[i];
    }
    return a;
}
template<typename T>class ARRAYnD{
public:
    T*pointer;
    ARRAY1<double>size;
    ARRAYnD(){
        pointer=0;//пустой массив
        size=<double>ARRAY();
    }
    ARRAYnD(ARRAY1<double>sz){
        double size1=1;for(int i;i<sz.size;i++){size1*=sz[i];}//не заполенный массив
        pointer=new T[PRO(i=0,i<sz.size,i++,double,(sz[i]))];
        size=sz;
    }
    ARRAYnD(T* p,ARRAY1<double>sz){
        double size1=1;for(int i;i<sz.size;i++){size1*=sz[i];}//инициализация стандартным массивом
        pointer=pointer=new T[size1];
        size=sz;
        for(double i=0;i<size1;i++){
            pointer[i]=p[i];
        }
    }
    ARRAYnD(ARRAYnD & obj){
        double size1=1;for(int i;i<sz.size;i++){size1*=sz[i];};//конструктор копирования
        pointer=new T[size1];
        size=obj.size;
        for(double i=0;i<size1;i++){
            pointer[i]=obj.pointer[i];
        }
    }
    ARRAYnD(ARRAY1<double>sz,T a,...){
        double size1=1;for(int i;i<sz.size;i++){size1*=sz[i];};//иинициализировать набором элементов
        pointer=new T[size1];
        size=sz;
        for(double i=0;i<size1;i++){
            pointer[i]=(&a)[i];
        }
    }
    ~ARRAYnD(){
        delete[]pointer;//деструктор
    }
    };
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 731
Записей в блоге: 1
24.07.2014, 16:50 #4
Полностью согласен с Tulosba: не пишите таких портянок. Как я понял, вы хотите написать шаблонный класс для многомерного массива? То есть приведённый код код должен работать:
C++
1
2
Array<int, 3> a;
Array<int, 2> row = a[0];
Я правильно понимаю?
0
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
24.07.2014, 17:03  [ТС] #5
Да CyberSolver, вы павы, только нужно чтобы мерность массива не была частью шаблона, может что-то с #define я не знаю.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.07.2014, 17:06 #6
Цитата Сообщение от Справлюсь Посмотреть сообщение
нужно чтобы мерность массива не была частью шаблона
Если кол-во измерений не будет частью шаблона (т.е. типа), то это уже будет тип универсального массива.
Т.о. переменная этого типа сможет хранить массив любого измерения. Так надо?
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 731
Записей в блоге: 1
24.07.2014, 17:12 #7
Цитата Сообщение от Справлюсь Посмотреть сообщение
только нужно чтобы мерность массива не была частью шаблона,
Кому это нужно? Так хотя бы типы контролируются, двумерный массив одномерному не присвоишь.
0
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
24.07.2014, 17:14  [ТС] #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Если кол-во измерений не будет частью шаблона (т.е. типа), то это уже будет тип универсального массива.
Т.о. переменная этого типа сможет хранить массив любого измерения. Так надо?
да, вы правы
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.07.2014, 17:23 #9
Справлюсь, ну если тип становится универсальным, то исходной проблемы получается что и нет.
Просто возвращаете этот тип и всё
0
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
24.07.2014, 17:32  [ТС] #10
Цитата Сообщение от Справлюсь Посмотреть сообщение
я хочу создать перегруженный оператор[] так штобыесли количество измерений массива = 1, возращался элемент типа "T", иначе массив с числом измерений на 1 меньше
понимаете?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.07.2014, 18:04 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Массив размерности 0 - это и будет Ваш элемент типа T. Можно добавить функцию преобразования в класс массива:
C++
1
2
3
4
5
operator T() const 
{
   // Если динамическая размерность = 0, то возвращаем элемент
   // Иначе ошибка выполнения
}
1
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
27.07.2014, 10:01  [ТС] #12
сдравствуйте это опять я. У меня появился новый вопос насчет оператора [ ].(см. тему "как создать функцию если тип возращаемого значения становится ясным в процессе работы функции") как вы помните я создал класс-многомерный массив и у меня сейчас возник вопрос: как по оддельности инициализировать элементы, когда я создавал одномерный массив я просто писал:
C++
1
2
3
T & operator[](ARRAY<T> & a,int i){
    return a.pointer[i]
}
а вызывал так
C++
1
a[i]=10
с помощю того способа кто мне предложили в прошлой теме (очень благодаренTulosba) это не получается.

Добавлено через 1 час 13 минут
кто-не-будь откликнитесь!
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 731
Записей в блоге: 1
27.07.2014, 18:09 #13
Покажите ваш нынешний код. И скажите, почему вам нужен тип универсального массива. Это ваша хотелка или какое-то внешнее требование?
0
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
29.07.2014, 19:53  [ТС] #14
Цитата Сообщение от CyberSolver Посмотреть сообщение
Покажите ваш нынешний код. И скажите, почему вам нужен тип универсального массива. Это ваша хотелка или какое-то внешнее требование?
Код программы меньше: меньше шаблонных параметров-меньше заголовки функций.
вот мой нынешний код:
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
//ARRAY1-класс одномерный массив
//MID(a,start,end)-часть массива а начиная с "старт" до "энд" включительно
//a[b]-элемент массива под номером "н" начиная с нуля
template<typename T>class ARRAYnD{
public:
    T*pointer;
    ARRAY1<double>size;
    ARRAYnD(){
        pointer=0;//пустой массив
        size=<double>ARRAY();
    }
    ARRAYnD(T* p,ARRAY1<double>sz){
        double size1=1;//инициализация стандартным массивом
        for(i=0;i<sz.size;i++)size1*=sz[i-1];
        pointer=pointer=new T[size1];
        size=sz;
        for(double i=0;i<size1;i++){
            pointer[i]=p[i];
        }
    }
    ARRAYnD(ARRAYnD & obj){
        double size1=1;
        for(i=0;i<sz.size;i++)size1*=sz[i-1];//конструктор копирования
        pointer=new T[size1];
        size=obj.size;
        for(double i=0;i<size1;i++){
            pointer[i]=obj.pointer[i];
        }
    }
    ~ARRAYnD(){
        delete[]pointer;//деструктор 
    }
    operator T(){return pointer[0];}
};
template<typename T>ARRAYnD<T> operator[](ARRAYnD<T>& a,double n){
    ARRAYnD<T>b(MID(a.size,1,a.size.size-1));
    double size1=1;
    for(i=0;i<sz.size;i++)size1*=sz[i-1];
    for(i=0;i<size1;i++)(b.pointer)[i]=(a.pointer)[i*a.size[0]];
    return b;
}
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 731
Записей в блоге: 1
29.07.2014, 20:24 #15
Справлюсь, вы только больше запутали дело. Почему у вас везде double вместо int для размеров? И опишите тогда уже точно задание. Как я понял из кода, вы пытаетесь создать класс для массива значений типа T, размеры (более точный термин shapes) которого заданы вектором целых чисел. То есть код
C++
1
2
int p[] = {3, 4, 5};
ARRAYnD<char> a(p);
надо понимать так: массив a будет 3 x 4 x 5 типа char. Я вас правильно понял?
1
29.07.2014, 20:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2014, 20:24
Привет! Вот еще темы с ответами:

Как определить тип возвращаемого значения шаблонной функции по типу итератора (не auto)? - C++
Здравствуйте. Есть шаблонная функция (например, суммирования). Входные значения два итератора -- начало конец. template &lt;typename...

Как создать функцию, которая определит с каким типом данных ей работать и подстроиться под этот тип? - C++
например если мне нужно создать шаблон функции сортировки одномерных массивов произвольного типа)))

Что может выступать в качестве аргумента функции, если тип параметра указан как std::ostream? - C++
#include &lt;iostream&gt; void func1(std::ostream so); void main() { func1(аргумент); std::cin.get(); } void...

Как вызвать функцию чужого приложения, как подменить значения аргументов функции? - C++
собственно вопрос первый: мне нужно каким то образом из своей программы/библиотеки вызвать функцию чужого приложения, естессно...


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

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

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