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

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

Восстановить пароль Регистрация
 
Справлюсь
 Аватар для Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
24.07.2014, 15:55     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #1
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++
C++ Функции (вызов и тип возвращаемого значения)
C++ 4.77. Составить программу для вычисления значения функции у(л): -1, если х < -1, у = х, если х > —1, 1, если х = -1
Символьные функции: Преобразовать массив так: стаж работы увеличить на год, если он станет равен 10, то зарплату увеличить в 2 раза, если 15 – в 3 раз C++
C++ Как в функции создать два массива и передать их в другую функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
 Аватар для 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.07.2014, 17:06     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #6
Цитата Сообщение от Справлюсь Посмотреть сообщение
нужно чтобы мерность массива не была частью шаблона
Если кол-во измерений не будет частью шаблона (т.е. типа), то это уже будет тип универсального массива.
Т.о. переменная этого типа сможет хранить массив любого измерения. Так надо?
CyberSolver
 Аватар для 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.07.2014, 17:23     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #9
Справлюсь, ну если тип становится универсальным, то исходной проблемы получается что и нет.
Просто возвращаете этот тип и всё
Справлюсь
 Аватар для Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
24.07.2014, 17:32  [ТС]     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #10
Цитата Сообщение от Справлюсь Посмотреть сообщение
я хочу создать перегруженный оператор[] так штобыесли количество измерений массива = 1, возращался элемент типа "T", иначе массив с числом измерений на 1 меньше
понимаете?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
 Аватар для 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;
}
CyberSolver
 Аватар для 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. Я вас правильно понял?
Справлюсь
 Аватар для Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
29.07.2014, 22:47  [ТС]     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #16
извените я конструктор
C++
1
2
3
4
5
6
ARRAYnD(ARRAY1<double>sz){
        double size1=1;
            for(i=0;i<sz.size;i++)size1*=sz[i-1];
        pointer=new T[PRO(i=0,i<sz.size,i++,double,(sz[i]))];
        size=sz;
    }
пропустил.
а насчёт "инт" и "доубле" нужно будет исправить

Добавлено через 2 часа 7 минут
Tulosba, можите помочь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 18:29     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Справлюсь
 Аватар для Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
20.08.2014, 18:29  [ТС]     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции #17
тема закрыта.
Yandex
Объявления
20.08.2014, 18:29     Как создать функцию, если тип возращаемого значения становится ясным в процессе работы функции
Ответ Создать тему
Опции темы

Текущее время: 03:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru