Вопрос № 183481: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Как правильно сделать перегрузку операции коньюнкции? На сегодняшний день есть такой код:
Код :
Вопрос № 183481:
Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Как правильно сделать перегрузку операции коньюнкции? На сегодняшний день есть такой код:
Код :
//Параметры:
//pIntArray - указатель на массив целых чисел
//len - размер вектора
BoolVector(int *pIntArray, int len) : Vector(pIntArray, len)
{
int i;
bool yes;
ValidValues[0] = 0;
ValidValues[1] = 1;
for(i=0;i<Count;i++)
{
yes = IsValid(Array[i]);
cout << Array[i] << endl;
if(!yes)
{
DeleteArray();
cout << "Неправильные данные: " << i << ") " << Array[i] << endl;
cout << "Вектор не создан..." << endl;
break;
}
}
}
..
//Поразрядная конъюнкция
BoolVector operator& (BoolVector Other)
{
int i, cnt;
if(GetCount() < Other.GetCount())
{
cnt = GetCount();
}
else
{
cnt = Other.GetCount();
}
int *arr = new int[cnt];
for(i=0;i<cnt;i++)
{
arr[i] = Array[i] & Other[i];
}
return BoolVector(arr, cnt);
}
Проблема в том, что не возвращается ничего, т.к. то, что написано в return исчезает сразу же, как только завершилась функция. Как правильно сделать, чтобы работала такая конструкция:
Отправлен: 01.06.2011, 21:08
Вопрос задал: sir Henry (Старший модератор)
Всего ответов: 1 Страница вопроса »
Отвечает Micren (Профессор) :
Здравствуйте, sir Henry! main.cpp
Код :
#include "boolvector.h"
int main()
{
int cnt = 4;
int ar1[] = {0, 1, 1, 0};
int ar2[] = {1, 1, 0, 1};
BoolVector V1(ar1, cnt);
BoolVector V2(ar2, cnt);
BoolVector V3;
int i;
V1.Print();
V2.Print();
V3 = V1 & V2;
V3.Print();
return 0;
}
boolvector.h
Код :
//Класс-наследник BoolVector, в векторе
//хранятся значения только 0 и 1
#ifndef BOOLVECTOR_H
#define BOOLVECTOR_H
#include <iostream>
#include "vector.h"
using namespace std;
class BoolVector : public Vector
{
public:
static const size_t npos;
//Конструкторы. Без параметров
BoolVector();
//Параметры:
//pIntArray - указатель на массив целых чисел
//len - размер вектора
BoolVector(size_t len);
BoolVector(int *pIntArray, size_t len);
//Конструктор копирования
BoolVector(const BoolVector &Other);
//Деструктор
virtual ~BoolVector();
//Получит количество единиц в векторе
size_t Get1Count() const;
//Получить позицию самой левой единицы
size_t GetLeft1() const;
//Перегрузка операций
//Поразрядная конъюнкция
BoolVector operator&(const BoolVector& Other) const;
//Поразрядная дизъюнкция
BoolVector operator|(const BoolVector& Other) const;
//Поразрядная инверсия
BoolVector operator~() const;
//Поразрядная ИСКЛЮЧАЮЩЕЕ ИЛИ
BoolVector operator^ (const BoolVector& Other) const;
protected:
static const int ValidValues[2]; //Массив образцов правильных значений для массива Array[]
//Функция проверки значений массива
//Array[] на правильность.
//Параметры:
//k - значение, передаваемое на проверку
bool IsValid(int k) const;
};
#endif
boolvector.cpp
Код :
#include <limits>
#include "boolvector.h"
const size_t BoolVector::npos = std::numeric_limits<size_t>::max();
const int BoolVector::ValidValues[2] = {0, 1};
BoolVector::BoolVector()
: Vector()
{
}
BoolVector::BoolVector(size_t len)
: Vector(len)
{
// Этого можно и не делать
for (size_t i = 0; i < Count; ++i)
{
Array[i] = 0;
}
}
BoolVector::BoolVector(int *pIntArray, size_t len)
: Vector(pIntArray, len)
{
bool yes;
for (size_t i = 0; i < Count; i++)
{
yes = IsValid(Array[i]);
cout << Array[i] << endl;
if (!yes)
{
cout << "Неправильные данные: " << i << ") " << Array[i] << endl;
cout << "Вектор не создан..." << endl;
break;
}
}
}
BoolVector::BoolVector(const BoolVector &Other)
: Vector(Other)
{
}
BoolVector::~BoolVector()
{
}
size_t BoolVector::Get1Count() const
{
size_t Cnt = 0;
for (size_t i = 0; i < Count; i++)
{
Cnt += Array[i] == 1;
}
return Cnt;
}
size_t BoolVector::GetLeft1() const
{
int i;
size_t Left1 = npos;
for (i = 0; i < Count; i++)
if (Array[i] == 1)
{
Left1 = i;
break;
}
return Left1;
}
BoolVector BoolVector::operator&(const BoolVector& Other) const
{
size_t cnt = std::min(Count, Other.Count);
BoolVector result(cnt);
for (size_t i = 0; i < cnt; i++)
{
result.Array[i] = Array[i] & Other.Array[i];
}
return result;
}
BoolVector BoolVector::operator|(const BoolVector& Other) const
{
size_t cnt = std::min(Count, Other.Count);
BoolVector result(cnt);
for (size_t i = 0; i < cnt; i++)
{
result.Array[i] = Array[i] | Other.Array[i];
}
return result;
}
BoolVector BoolVector::operator~() const
{
BoolVector result(Count);
for (size_t i = 0; i < Count; i++)
{
result.Array[i] = ~Array[i];
}
return result;
}
BoolVector BoolVector::operator^ (const BoolVector& Other) const
{
size_t cnt = std::min(Count, Other.Count);
BoolVector result(cnt);
for (size_t i = 0; i < cnt; i++)
{
result.Array[i] = Array[i] ^ Other.Array[i];
}
return result;
}
bool BoolVector::IsValid(int k) const
{
return (k == ValidValues[0] || k == ValidValues[1]);
}
vector.h
Код :
//Класс-предок Vector, базовый, на основе которого
//будет наследован класс BoolVector
#ifndef VECTOR_H
#define VECTOR_H
#include <stdlib.h>
#include <iostream>
using namespace std;
class Vector
{
public:
//Конструкторы. Без параметров
Vector();
Vector(size_t len);
//Параметры:
//pIntArray - указатель на массив целых чисел
//len - размер вектора
Vector(int *pIntArray, size_t len);
Vector(const Vector& Other);
//Деструктор
virtual ~Vector();
//Получить количество ячеек массива
size_t GetCount() const;
//Вывод элементов массива на экран
void Print() const;
//Перегрузка операций
int& operator[] (size_t Index);
Vector & operator=(const Vector& Other);
protected:
int *Array; //Массив-хранилище целых чисел
size_t Count; //Количество элементов в массиве
private:
// Копирование данных
// Т.к такие вещи приходится делать в нескольких местах то вынесем в метод
void Copy(int *pIntArray, size_t len);
// Освобождение ресурсов
void Destroy();
};
#endif
vector.cpp
Код :
#include "vector.h"
void Vector::Copy(int *pIntArray, size_t len)
{
if (pIntArray)
{
Destroy();
Array = new int[len];
for (size_t i = 0; i < len; ++i)
{
Array[i] = pIntArray[i];
}
Count = len;
}
}
void Vector::Destroy()
{
if (Array)
{
delete[] Array;
Array = 0;
Count = 0;
}
}
Vector::Vector()
: Count(0)
, Array(0)
{
}
Vector::Vector(size_t len)
: Count(len)
, Array(0)
{
Array = new int[len];
}
Vector::Vector(int *pIntArray, size_t len)
: Count(0)
, Array(0)
{
Copy(pIntArray, len);
}
Vector::Vector(const Vector& Other)
: Array(0)
, Count(0)
{
Copy(Other.Array, Other.Count);
}
Vector::~Vector()
{
Destroy();
}
inline size_t Vector::GetCount() const
{
return Count;
}
void Vector::Print() const
{
int i, j;
cout << "m" << GetCount() << endl;
for (i = 0; i < Count; i++)
{
cout << Array[i] << ", ";
}
cout << endl;
}
int& Vector::operator[] (size_t Index)
{
if (Index >= Count)
{
// Тут лучше генерировать исключение
cout << "Индекс больше, чем количество данных..." << endl;
exit(1);
}
return Array[Index];
}
Vector& Vector::operator=(const Vector& Other)
{
if (this != &Other)
{
Destroy();
Copy(Other.Array, Other.Count);
}
return *this;
}
Ответ отправил: Micren (Профессор)
Ответ отправлен: 02.06.2011, 15:12
Номер ответа: 267539 Украина, Краматорск
Оценка ответа: 5 Комментарий к оценке: Отлично!
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 267539
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.