Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 8229
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2673
∙ повысить рейтинг »
Жерар
Статус: Профессор
Рейтинг: 2441
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1675
Дата выхода:07.06.2011, 17:00
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:304 / 177
Вопросов / ответов:1 / 1

Вопрос № 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 исчезает сразу же, как только завершилась функция. Как правильно сделать, чтобы работала такая конструкция:
Код :
BoolVector V1;
BoolVector V2;
BoolVector V3;

..

V3 = V1 & V2;
..

?

Отправлен: 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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное