Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt]Перегрузка оператора 
:(
    Опции темы
aspirin2003
Дата 24.7.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



В общем заработало когда переопределил так:
Код

void CalcElement::operator =(CalcElement &m1)
{
    this->mask = m1.mask;
    this->tuple = m1.tuple;
    this->maskLen = m1.maskLen;
    this->tupleLen = m1.tupleLen;
}

 Однако мне кажется что это не лучший способ (данные перемещаются из одной области памяти в другую).
 Может есть какой-нибудь способ передачи по указателю/ссылке?
PM MAIL   Вверх
SABROG
Дата 24.7.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(aspirin2003 @  24.7.2008,  16:36 Найти цитируемый пост)
данные перемещаются из одной области памяти в другую


Т.е. если позволить компилятору присваивать данные за тебя, то перемещения данных из одной области памяти в другую не будет ;) ? Посмотри как в Qtшных классах реализован алгоритм  "implicit sharing (copy-on-write)" и сделай также если хватит знаний.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Любитель
Дата 24.7.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Цитата(SABROG @  24.7.2008,  17:30 Найти цитируемый пост)
Посмотри как в Qtшных классах реализован алгоритм  "implicit sharing (copy-on-write)" и сделай также если хватит знаний. 

Там реализовано через свои макросы, но предоставляется ready to use класс QImplicitSharedDataPointer (может в названии чуть ошибся). С подробным и простым how to use it. Главное консты расставлять на методах - иначе вдобавок к COW будет COR (Copy on reading) smile


--------------------
PM MAIL ICQ Skype   Вверх
SABROG
Дата 24.7.2008, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Асистент вроде не находит. Нашел только QAtomicInt и QAtomicPointer, но пока не понял их предназначение.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
aspirin2003
Дата 25.7.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(SABROG @ 24.7.2008,  17:30)
Посмотри как в Qtшных классах реализован алгоритм  "implicit sharing (copy-on-write)" и сделай также если хватит знаний.

Прочитал статью Data Sharing with Class. Круто придумано, нечего сказать smile
PM MAIL   Вверх
SABROG
Дата 25.7.2008, 11:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Так, значит речь идет QSharedDataQSharedDataPointer и QSharedMemory, и QExplicitlySharedDataPointer

Народ, поздравлю всех с Днем Системного Администратора


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Любитель
Дата 25.7.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Цитата(SABROG @  25.7.2008,  11:10 Найти цитируемый пост)
QSharedDataPointer 

Ну да, писал по памяти - ошибся smile


--------------------
PM MAIL ICQ Skype   Вверх
aspirin2003
Дата 26.7.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(Любитель @ 24.7.2008,  19:01)
Главное консты расставлять на методах - иначе вдобавок к COW будет COR (Copy on reading) smile

Но только в случае, когда методы не модифицируют данные, так?
PM MAIL   Вверх
anatox91
Дата 26.7.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



aspirin2003, ну если модифицируют, то можно сделать эти данные mutable, но все конечно зависит от ситуации


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
aspirin2003
Дата 27.7.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Попробовал переписал класс с использованием QSharedData. Вот примерно то, что получилось:
calcelement.h
Код

#ifndef CALCELEMENT_H
#define CALCELEMENT_H

#include <QObject>
#include <QSharedData>
#include <QStringList>
#include <QVector>

typedef QVector<int> matr_row;
typedef QVector<matr_row> matrix_double;

class CalcElementData : public QSharedData
{
public:
    CalcElementData() {}
    CalcElementData(const CalcElementData &other) : QSharedData(other) {}
    ~CalcElementData() {}
    QStringList tuple;
    matrix_double mask;
    int tupleLen;
    int maskLen;
};

class CalcElement : public QObject
{
    Q_OBJECT

public:
    CalcElement(QObject *parent);
    CalcElement(const CalcElement& c_el);
    CalcElement(CalcElement& c_el);
    ~CalcElement();
    CalcElement operator + (CalcElement &m1);
    void operator = (CalcElement &m1);
    void operator += (CalcElement &m1);

private:
    QSharedDataPointer<CalcElementData> d;

};

#endif // CALCELEMENT_H


calcelement.cpp
Код

#include "calcelement.h"

CalcElement::CalcElement(QObject *parent)
    : QObject(parent)
{
    d = new CalcElementData;
}

CalcElement::~CalcElement()
{
}

CalcElement CalcElement::operator +(CalcElement &m1)
{
    CalcElement res(NULL);
    /*код*/
    return res;
}

void CalcElement::operator +=(CalcElement &m1)
{
    CalcElement res(NULL);
    res = *this + m1;
    d = res.d;
}

void CalcElement::operator =(CalcElement &m1)
{
    d = m1.d;
}


CalcElement::CalcElement(const CalcElement& c_el)
{
    d = c_el.d;
}

CalcElement::CalcElement(CalcElement& c_el)
{
    d = c_el.d;
}



MSVC этот код компилит нормально, все работает. А gcc ругается в этой строке:
Код

res = *this + m1;

no match for 'operator=' in 'res = CalcElement::operator+(CalcElement&)(((CalcElement&)(+m1)))'    calcelement.cpp    

Помогите пожалуйста разобраться, в чем косяк.
PM MAIL   Вверх
aspirin2003
Дата 27.7.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Ни у кого никаких соображений? Просто надо чтобы программа работала и под Linux тоже, а gcc ругается :(
PM MAIL   Вверх
nickless
Дата 28.7.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



aspirin2003, типы операторам надо давать не какие попало, а какие положено smile 

*.h
Код

#include <QObject>
#include <QSharedData>
#include <QStringList>
#include <QVector>

typedef QVector<int> matr_row;
typedef QVector<matr_row> matrix_double;

class CalcElementData : public QSharedData
{
public:
    CalcElementData() {}
    CalcElementData(const CalcElementData &other) : QSharedData(other) {}
    ~CalcElementData() {}
    QStringList tuple;
    matrix_double mask;
    int tupleLen;
    int maskLen;
};
class CalcElement : public QObject
{
    Q_OBJECT
public:
    CalcElement(QObject *parent);
    CalcElement(const CalcElement& c_el);
    ~CalcElement();
    CalcElement operator+ (const CalcElement &m1);
    CalcElement & operator= (const CalcElement &m1);
    CalcElement & operator+= (const CalcElement &m1);
private:
    QSharedDataPointer<CalcElementData> d;
};
#endif // CALCELEMENT_H


*.cpp
Код

#include "calcelement.h"
CalcElement::CalcElement(QObject *parent)
    : QObject(parent)
{
    d = new CalcElementData;
}

CalcElement::CalcElement(const CalcElement& c_el)
    : QObject(c_el.parent())
{
    d = c_el.d;
}

CalcElement::~CalcElement()
{
}

CalcElement CalcElement::operator +(const CalcElement &m1)
{
    CalcElement res(NULL);
    /*код*/
    return res;
}

CalcElement & CalcElement::operator +=(const CalcElement &m1)
{
    CalcElement res(NULL);
    res = *this + m1;
    d = res.d;
    return *this;
}

CalcElement & CalcElement::operator =(const CalcElement &m1)
{
    d = m1.d;
    return *this;
}


Это сообщение отредактировал(а) nickless - 28.7.2008, 21:16


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
aspirin2003
Дата 29.7.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



nickless Спасибо! Все заработало!
PM MAIL   Вверх
WizardNG
Дата 26.7.2019, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 15.2.2006
Где: Н. Новгород

Репутация: нет
Всего: нет



удалено

Это сообщение отредактировал(а) WizardNG - 26.7.2019, 15:00
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.