Мне нужно именно массивов. Что-то типо этого:
int operator(int a[], int b[]) [] { бла бла бла }
Можно конечно использовать другие классы, но в простых массивах есть особенность: в процессе компиляции можно проверять длину массива. Можно использовать класс array. Но для простого массива он уж больно громозкий и медленный.
Другие языки программирования и технологии
Можно ли сделать оператор сложения двух массивов в С++ ?
//Вот примерно подкорректировал под данную задачу:
#include <iostream>
#include <stdlib.h>
using namespace std;
template < class T >
class vect
{
protected:
T* p;
int size;
public:
vect(int n); // создается массив размерности n
vect(int n,T z);
vect(const vect& v); // инициализация от vect
~vect() { delete [] p; p=NULL; }
int up() const { return(size-1); } // верхняя граница
int len() const { return(size); } // верхняя граница
T& operator[](int i); // элемент проверенный на соответствие границ
vect< T > operator+(vect< T >& a);
void operator=(vect< T >& a);
void print() const;
};
template < class T > vect< T >::vect(int n)
{
if(n<=0) cerr << "Неправильный размер массива " << n << endl,exit(1);
p=new T[(size=n)];
if(!p) cerr << "Свободная память исчерпана\n",exit(1);
for(int i=0;i < size;p[i++]=0);
}
template < class T > vect< T >::vect(int n,T z)
{
if(n<=0) cerr << "Неправильный размер массива (гр) " << n << endl,exit(1);
p=new T[(size=n)];
if(!p) cerr << "Свободная память исчерпана\n",exit(1);
for(int i=0;i < size;p[i++]=z);
}
template < class T > vect< T >::vect(const vect< T >& v)
{
size=v.size; p=new T[size];
if(!p) cout << "Свободная память исчерпана\n",exit(1);
for(int i=0;i < size;++i) p[ i ]=v.p[ i ];
}
template < class T > T& vect< T >::operator[](const int i)
{
if(i < 0||i > up()) cerr << "Неправильный индекс массива vect=" << i << endl,exit(1);
return(p[ i ]);
}
template < class T > void vect< T >::print() const
{
cout << "Size=" << size << ": ";
for(int i=0;i < size;cout << p[i++] << '\t'); cout << endl;
}
template < class T > vect< T > vect< T >::operator+(vect< T >& a)
{
int i;
if(a.len()>len())
{
vect< T > r(a.len());
for(i=0;i < len();i++) r[ i ]+=p[ i ]+a[ i ];
for(;i < a.len();i++) r[ i ]=a[ i ];
return r;
}
else
{
vect< T > r(len());
for(i=0;i < a.len();i++) r[ i ]+=p[ i ]+a[ i ];
for(;i < len();i++) r[ i ]=p[ i ];
return r;
}
}
template < class T > void vect< T >::operator=(vect< T >& a)
{
int i;
if(a.len()>len())
for(i=0;i < len();i++) p[ i ]=a[ i ];
else
{
for(i=0;i < a.len();i++) p[ i ]=a[ i ];
for(;i < len();i++) p[ i ]=0;
}
return;
}
int main()
{
vect< int > A(5,1),B(3,2),C(7),D(2),E(5);
C=A+B;
A.print();
cout << "+" << endl;
B.print();
cout << "---------------" << endl;
C.print();
cout << endl;
E=B+A;
B.print();
cout << "+" << endl;
A.print();
cout << "---------------" << endl;
E.print();
cout << endl;
A.print();
cout << "+" << endl;
B.print();
D=A+B;
cout << "---------------" << endl;
D.print();
return 0;
}
#include <iostream>
#include <stdlib.h>
using namespace std;
template < class T >
class vect
{
protected:
T* p;
int size;
public:
vect(int n); // создается массив размерности n
vect(int n,T z);
vect(const vect& v); // инициализация от vect
~vect() { delete [] p; p=NULL; }
int up() const { return(size-1); } // верхняя граница
int len() const { return(size); } // верхняя граница
T& operator[](int i); // элемент проверенный на соответствие границ
vect< T > operator+(vect< T >& a);
void operator=(vect< T >& a);
void print() const;
};
template < class T > vect< T >::vect(int n)
{
if(n<=0) cerr << "Неправильный размер массива " << n << endl,exit(1);
p=new T[(size=n)];
if(!p) cerr << "Свободная память исчерпана\n",exit(1);
for(int i=0;i < size;p[i++]=0);
}
template < class T > vect< T >::vect(int n,T z)
{
if(n<=0) cerr << "Неправильный размер массива (гр) " << n << endl,exit(1);
p=new T[(size=n)];
if(!p) cerr << "Свободная память исчерпана\n",exit(1);
for(int i=0;i < size;p[i++]=z);
}
template < class T > vect< T >::vect(const vect< T >& v)
{
size=v.size; p=new T[size];
if(!p) cout << "Свободная память исчерпана\n",exit(1);
for(int i=0;i < size;++i) p[ i ]=v.p[ i ];
}
template < class T > T& vect< T >::operator[](const int i)
{
if(i < 0||i > up()) cerr << "Неправильный индекс массива vect=" << i << endl,exit(1);
return(p[ i ]);
}
template < class T > void vect< T >::print() const
{
cout << "Size=" << size << ": ";
for(int i=0;i < size;cout << p[i++] << '\t'); cout << endl;
}
template < class T > vect< T > vect< T >::operator+(vect< T >& a)
{
int i;
if(a.len()>len())
{
vect< T > r(a.len());
for(i=0;i < len();i++) r[ i ]+=p[ i ]+a[ i ];
for(;i < a.len();i++) r[ i ]=a[ i ];
return r;
}
else
{
vect< T > r(len());
for(i=0;i < a.len();i++) r[ i ]+=p[ i ]+a[ i ];
for(;i < len();i++) r[ i ]=p[ i ];
return r;
}
}
template < class T > void vect< T >::operator=(vect< T >& a)
{
int i;
if(a.len()>len())
for(i=0;i < len();i++) p[ i ]=a[ i ];
else
{
for(i=0;i < a.len();i++) p[ i ]=a[ i ];
for(;i < len();i++) p[ i ]=0;
}
return;
}
int main()
{
vect< int > A(5,1),B(3,2),C(7),D(2),E(5);
C=A+B;
A.print();
cout << "+" << endl;
B.print();
cout << "---------------" << endl;
C.print();
cout << endl;
E=B+A;
B.print();
cout << "+" << endl;
A.print();
cout << "---------------" << endl;
E.print();
cout << endl;
A.print();
cout << "+" << endl;
B.print();
D=A+B;
cout << "---------------" << endl;
D.print();
return 0;
}
Максим Хлебников
Мне нужен такой контейнер. Чтобы при передаче его как параметр в функцию нельзя было передать контейнер содержащего больше чем N количество элементов. Хотелось бы чтобы эта ошибка обнаруживалась на этапе компиляции
Можно, конечно. Сделай сам свой класс массивов.
Максим Хлебников
Я же написал что в простых массивах можно проверять длину массива во времени компиляции. А если класс сделать, то есть риск что я никогда не узнаю что у меня есть узкое место в программе где может произойти переполнение массива. А если сделать шаблон где параметром является длина массива. Тогда мне может понадобиться сделать тысячу массивов разной длины и тогда компилятор будет раз за разом переписывать программынй код. Ни то ни это не подходит. Или вы можете предложить оптимальный класс?
В Делфи можно...
Всё равно возвращаемое значение функции - динамический массив. Конечно, можно описать что-то вроде этого:
#define N 5
typedef int array[N];
array& plus_op(array& a,array& b)
{
static array result;
for (int i = 0 ; i < N ; i++)
{
result\[i\] = a\[i\] + b\[i\];
}
return result;
}
Но лучше использовать готовые классы. Например, valarray. Для него уже определены все необходимые операции, в том числе и сложение.
#define N 5
typedef int array[N];
array& plus_op(array& a,array& b)
{
static array result;
for (int i = 0 ; i < N ; i++)
{
result\[i\] = a\[i\] + b\[i\];
}
return result;
}
Но лучше использовать готовые классы. Например, valarray. Для него уже определены все необходимые операции, в том числе и сложение.
создай свой класс по обработке массивов.
а после переопредели знак "+", для своего метода.
примеры есть везде, просто напиши "переопределение операций"
а после переопредели знак "+", для своего метода.
примеры есть везде, просто напиши "переопределение операций"
Максим Хлебников
Я уже искал в интернете. Я поэтому здесь и задаю вопрос, что ненашол и незнаю как это можно сделать. Боюсь что никакой класс несможет удовлетворить мою потребность. Мне же нужно сложение двух масиивов. Вот только какой класс не пиши, а все его операнды будут указателями, что не допускается.
Можно. MSDN в помощь.
Максим Хлебников
Тогда окажите помощь и подскажите в каком месте MSDN я могу найти нужную мне информацию
Похожие вопросы
- помогите пожалуйста сделать мне практическую по массивам, пожалуйста!!!
- Как сделать такую перестановку в массиве Си?
- Как сделать чтобы юзер сам записал элементы массива
- Помогите сделать лабораторную работу по теме "Одномерные массивы" [C++]
- Помогите сделать функцию для массива.
- С++. Как сделать, чтобы значение массива, созданного в структуре изменялось в другой процедуре?
- Задача на C++ по одномерным (статическим) массивам, помогите сделать, пожалуйста, очень надо на завтра
- ПОМОГИТЕ СДЕЛАТЬ ПРОГРАММИРОВАНИЕ ЛВУМЕРНЫЙ МАССИВ
- Перегрузка сложения в С++
- 1.Заполнить массив случайными числами. Вывести элементы массива на экран. Заменить все его минимальные элементы нулями.