Модераторы: JackYF, Любитель

Поиск:

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


Шустрый
*


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

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



Извиняюсь что не совсем в тему, но все же...
В общем создаю класс, наследуя его от QObject, например:
Код

#ifndef CALCELEMENT_H
#define CALCELEMENT_H

#include <QObject>
#include <QStringList>

class CalcElement : public QObject
{
    Q_OBJECT

public:
    CalcElement(QObject *parent);
    ~CalcElement();
    CalcElement operator + (CalcElement &m1);

private:
    double dd;
    
};

#endif // CALCELEMENT_H

Код

#include "calcelement.h"

CalcElement::CalcElement(QObject *parent)
    : QObject(parent)
{
    this->dd = 100;
}

CalcElement::~CalcElement()
{

}

CalcElement CalcElement::operator +(CalcElement &m1)
{
    CalcElement res(NULL);
    res.dd = dd + m1.dd;
    return res;
}

и пытаюсь перегрузить в нем оператор '+'

Проверяю так:
Код

    CalcElement elem(NULL);
    CalcElement elem1(NULL);
    CalcElement elem2 = elem + elem1;


Но выскакивает ошибка:
error C2248: 'QObject::QObject' : cannot access private member declared in class 'QObject'

Если же не наследоваться от QObject, то все ok. 


PM MAIL   Вверх
anatox91
Дата 21.7.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(aspirin2003 @  21.7.2008,  10:14 Найти цитируемый пост)
res.dd = dd + m1.dd;

у тебя же dd - private


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

The code is the design ©

Sony VAIO VGN-FW480J

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


Шустрый
*


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

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



Цитата(anatox91 @ 21.7.2008,  10:18)
Цитата(aspirin2003 @  21.7.2008,  10:14 Найти цитируемый пост)
res.dd = dd + m1.dd;

у тебя же dd - private

Ну и что? dd используется внутри класса CalcElement, и доступен его методам. Дело не в этом, я думаю
P.S. На всякий случай проверил, сделал public - ничего не изменилось
PM MAIL   Вверх
anatox91
Дата 21.7.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



aspirin2003, тю блин, сорри, забыл что это мембер


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

The code is the design ©

Sony VAIO VGN-FW480J

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


Hacker
****


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

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



Попробуй использовать вместо dd другое имя, обычно имена и dd используются в приватных классах Qt. Попробуй так изменить:

Код

res.dd = CalcElement::dd + m1.dd;



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


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


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

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



*deleted*

Это сообщение отредактировал(а) anatox91 - 21.7.2008, 11:21


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

The code is the design ©

Sony VAIO VGN-FW480J

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


Hacker
****


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

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



Цитата(anatox91 @ 21.7.2008,  11:20)
*deleted*

Да нет, только [] и то где-то в QObjectPrivate.


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


Шустрый
*


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

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



Цитата(SABROG @ 21.7.2008,  11:19)
Попробуй использовать вместо dd другое имя, обычно имена и dd используются в приватных классах Qt. Попробуй так изменить:

Код

res.dd = CalcElement::dd + m1.dd;

Нет, эта строка вообще не влияет на ошибку. Даже если ее закомментировать и возвращать NULL, то ничего не меняется.
Насколько я понял, ошибка возникает здесь: 
Код

   CalcElement res(NULL);


P.S. На всякий случай изменять имя на другое пробовал, не помогает

Это сообщение отредактировал(а) aspirin2003 - 21.7.2008, 11:42
PM MAIL   Вверх
SABROG
Дата 21.7.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



В общем дело обстоит так. Конструктор копирования у классов на базе QObject переопределен таким образом, чтобы запретить эту операцию. Существует макрос Q_DISABLE_COPY:

Код

#if !defined(Q_NO_DECLARED_NOT_DEFINED) || !defined(QT_MAKEDLL)
 #define Q_DISABLE_COPY(Class) \
     Class(const Class &); \
     Class &operator=(const Class &);
#else
 #define Q_DISABLE_COPY(Class)
#endif


Который прописан в секции private QObject'a:

Код

protected:
    QObjectData *d_ptr;

    static const QMetaObject staticQtMetaObject;

    friend struct QMetaObject;
    friend class QApplication;
    friend class QApplicationPrivate;
    friend class QCoreApplication;
    friend class QCoreApplicationPrivate;
    friend class QWidget;
    friend class QThreadData;

private:
    Q_DISABLE_COPY(QObject)
    Q_PRIVATE_SLOT(d_func(), void _q_reregisterTimers(void *))
};



Может быть возможно переопределить конструктор копирования в своем классе и оператор =, но не известно к чему это может привести.

Это сообщение отредактировал(а) SABROG - 21.7.2008, 12:12


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


Шустрый
*


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

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



Цитата(SABROG @ 21.7.2008,  12:08)
Может быть возможно переопределить конструктор копирования в своем классе и оператор =, но не известно к чему это может привести.

Моих знаний по C++ врядли хватит чтобы самому с этим разобраться :(
Возможно ли решить проблему другим способом? Ведь перегрузка операторов в классе - достаточно распространенное явление

P.S. Сделал так:
Код

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


Теперь вроде работает, но прочитал в одной статейке, что "...Переопределение конструктора копирования является чрезвычайно ответственным поступком. Явное определение конструктора копирования вызывает изменения в работе программы..."

Теперь еще вопрос - надо ли в конструкторе копирования что-либо делать с методами класса, или делать только копирование его полей?

Это сообщение отредактировал(а) aspirin2003 - 21.7.2008, 13:27
PM MAIL   Вверх
SABROG
Дата 21.7.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Конструктор копирования, что идет по-умолчанию сам копирует поля с данными. К методам это никак не относится, код методов один для всех экземпляров класса один, если только это не шаблон класса, где под каждый тип генерятся методы.

Кстати интересно возможно ли вызвать дефолтный конструктор копирования ?:

Код

CalcElement::CalcElement(const CalcElement& c_el)
{
    CalcElement::CalcElement(c_el);
}


Или возникнет рекурсия ?

А вообще конструкторов 2:

CalcElement::CalcElement(const CalcElement& c_el)
CalcElement::CalcElement(CalcElement& c_el)



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


Шустрый
*


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

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



Цитата(SABROG @ 21.7.2008,  13:42)
Кстати интересно возможно ли вызвать дефолтный конструктор копирования ?:

Код

CalcElement::CalcElement(const CalcElement& c_el)
{
    CalcElement::CalcElement(c_el);
}


Или возникнет рекурсия ?

Не знаю насчет рекурсии, но Access violation точно возникает
PM MAIL   Вверх
SABROG
Дата 21.7.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Потому что стек заканчивается на возврат. Т.е. рекурсия идет.


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


Шустрый
*


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

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



Всем спасибо за ответы, особенно SABROG
PM MAIL   Вверх
aspirin2003
Дата 24.7.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Теперь в коде:
Код

CalcElement res(NULL);
CalcElement item_1(NULL);
CalcElement item_2(NULL);
...
res = item_1 + item_2;

 вылазит ошибка
error C2248: 'QObject::operator =' : cannot access private member declared in class 'QObject'
Насколько я понял теперь еще нужно переопределить оператор '='.  Как это лучше сделать - копированием полей как в конструкторе копирования, или есть какой-то более оптимальный способ, чтобы не тратить время на перемещение данных в памяти?

P.S. Тем более как выяснилось, простое копирование полей не прокатывает :(
Делаю:
Код

CalcElement CalcElement::operator =(CalcElement &m1)
{
    CalcElement res(NULL);
    res.mask = m1.mask;
    res.tuple = m1.tuple;
    res.maskLen = m1.maskLen;
    res.tupleLen = m1.tupleLen;
    return res;
}


В res вроде все как надо, а возвращаемый на самом деле объект в полях содержит какую-то чушь.
Скорее всего надо как-то по-другому делать, а как именно я не знаю. Помогите пожалуйста!

Это сообщение отредактировал(а) aspirin2003 - 24.7.2008, 09:59
PM MAIL   Вверх
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   Вверх
Google
  Дата 16.10.2019, 22:52 (ссылка)  





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

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

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


 




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


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

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