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

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

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

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

24.07.2014, 15:55. Просмотров 624. Ответов 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 меньше. Если заметите ошибки в программе пишите буду благодарен.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2014, 15:55     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции
Посмотрите здесь:

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

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

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

Как определить тип возвращаемого значения шаблонной функции по типу итератора (не 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++
Я вывел для себя 2 способа возвращать значения работы функции string Add(string a1, string a2) { string returnStr; returnStr +=...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.07.2014, 16:04     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #2
Справлюсь, не стоит приводить такие простыни кода, если о проблеме можно рассказать и без этого.
Уберите лишнее и приведите вариант Вашей реализации (потенциальной). Так Вам быстрее помогут.
Справлюсь
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;//деструктор
    }
    };
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
24.07.2014, 16:50     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #4
Полностью согласен с Tulosba: не пишите таких портянок. Как я понял, вы хотите написать шаблонный класс для многомерного массива? То есть приведённый код код должен работать:
C++
1
2
Array<int, 3> a;
Array<int, 2> row = a[0];
Я правильно понимаю?
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
24.07.2014, 17:03  [ТС]     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #5
Да CyberSolver, вы павы, только нужно чтобы мерность массива не была частью шаблона, может что-то с #define я не знаю.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.07.2014, 17:06     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #6
Цитата Сообщение от Справлюсь Посмотреть сообщение
нужно чтобы мерность массива не была частью шаблона
Если кол-во измерений не будет частью шаблона (т.е. типа), то это уже будет тип универсального массива.
Т.о. переменная этого типа сможет хранить массив любого измерения. Так надо?
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
24.07.2014, 17:12     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #7
Цитата Сообщение от Справлюсь Посмотреть сообщение
только нужно чтобы мерность массива не была частью шаблона,
Кому это нужно? Так хотя бы типы контролируются, двумерный массив одномерному не присвоишь.
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
24.07.2014, 17:14  [ТС]     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Если кол-во измерений не будет частью шаблона (т.е. типа), то это уже будет тип универсального массива.
Т.о. переменная этого типа сможет хранить массив любого измерения. Так надо?
да, вы правы
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.07.2014, 17:23     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #9
Справлюсь, ну если тип становится универсальным, то исходной проблемы получается что и нет.
Просто возвращаете этот тип и всё
Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
24.07.2014, 17:32  [ТС]     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #10
Цитата Сообщение от Справлюсь Посмотреть сообщение
я хочу создать перегруженный оператор[] так штобыесли количество измерений массива = 1, возращался элемент типа "T", иначе массив с числом измерений на 1 меньше
понимаете?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.07.2014, 18:04     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Массив размерности 0 - это и будет Ваш элемент типа T. Можно добавить функцию преобразования в класс массива:
C++
1
2
3
4
5
operator T() const 
{
   // Если динамическая размерность = 0, то возвращаем элемент
   // Иначе ошибка выполнения
}
Справлюсь
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 минут
кто-не-будь откликнитесь!
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
27.07.2014, 18:09     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #13
Покажите ваш нынешний код. И скажите, почему вам нужен тип универсального массива. Это ваша хотелка или какое-то внешнее требование?
Справлюсь
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2014, 20:24     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции
Еще ссылки по теме:

Как в функции создать два массива и передать их в другую функцию - C++
Как в функции создать два массива и передать их в другую функцию, например в main()? Так хорошо делать? double * Func(double *B,...

По ссылке на функцию получить тип возвращаемого этой функцией значения - C++
Существует задача следующего характера. Шаблон класса параметризуется ссылкой на функцию. Необходимо, чтобы один из членов класса имел тип,...

Создать динамический классовый тип для работы со строками символов - C++
Создать динамический классовый тип для работы со строками символов. Максимальная длина строки - 65535 символов. Считать , что длина строки...

Тип возвращаемого значения функции - C++
есть класс point. в другом классе есть член функция point GetUpperLeft() { return itsUpperLeft; } эта член-функция исходя из типа...

Функции (вызов и тип возвращаемого значения) - C++
Доброй ночи! Кто может помочь мне по следующей задачей? Есть динамический массив в main(): double *m=new double ; Есть функция...


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

Или воспользуйтесь поиском по форуму:
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 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. Я вас правильно понял?
Yandex
Объявления
29.07.2014, 20:24     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции
Ответ Создать тему
Опции темы

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