Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sancho_s_rancho от Май 26, 2010, 12:39



Название: [РЕШЕНО]QLatin1String operator+
Отправлено: Sancho_s_rancho от Май 26, 2010, 12:39
Почему следующий код работает?
Код:
static const char a[]="aaa";
    static const char b[]="bbb";

    qDebug() << (QLatin1String(a)+QLatin1String(b));
У класса QLatin1String ведь нет оператора сложения.


Название: Re: QLatin1String operator+
Отправлено: Авварон от Май 26, 2010, 13:00
зато есть QString::QString ( const QLatin1String & str ) можен он срабатывает?


Название: Re: QLatin1String operator+
Отправлено: zenden от Май 26, 2010, 13:20
Срабатывает глобальный оператор+

Код
C++ (Qt)
#ifndef QT_USE_FAST_OPERATOR_PLUS
# ifndef QT_USE_FAST_CONCATENATION
inline const QString operator+(const QString &s1, const QString &s2)
{ QString t(s1); t += s2; return t; }


Название: Re: QLatin1String operator+
Отправлено: Sancho_s_rancho от Май 26, 2010, 13:32
Но QString  - это один класс, а  QLatin1String - другой. Если бы там было что-то типа
Код:
const QString operator+ ( const QLatin1String & s1, const QLatin1String & s2 )
 это можно было бы понять. Вот тут все понятно:
Код:
QString & QString::operator= ( const QLatin1String & str )
QString & QString::operator= ( const char * str )
А с оператором сложения - несовсем.


Название: Re: QLatin1String operator+
Отправлено: Amigo_sa от Май 26, 2010, 13:45
Если куте собрана в дебаге, то можно пропробовать в отладчике посмотреть какой оператор выполняется...


Название: Re: QLatin1String operator+
Отправлено: zenden от Май 26, 2010, 13:52
Amigo_sa
ну на то у С++ и самые сложные компиляторы среди ЯП, чтобы решать подобные задачки.
Вас ведь не удивляет то, что вы можете  в любую функцию, вместо  QString передать  QLatin1String ?

Компилятор ищет тот operator+, который может принять оба аргумента (с учетом приведения типов)


Название: Re: QLatin1String operator+
Отправлено: Sancho_s_rancho от Май 26, 2010, 14:00
Amigo_sa
ну на то у С++ и самые сложные компиляторы среди ЯП, чтобы решать подобные задачки.
Вас ведь не удивляет то, что вы можете  в любую функцию, вместо  QString передать  QLatin1String ?

Компилятор ищет тот operator+, который может принять оба аргумента (с учетом приведения типов)
Все-таки компилятор C++ это не некий черный ящик который что-то прикидывает и куда-то что-то запихивает. Есть стандарт ISO/IEC 14882:2003 Programming Language C++.
Насколько я понял ответ на мой вопрос лежит в классе QStringBuilder


Название: Re: QLatin1String operator+
Отправлено: Amigo_sa от Май 26, 2010, 14:07
Amigo_sa
ну на то у С++ и самые сложные компиляторы среди ЯП, чтобы решать подобные задачки.
Вас ведь не удивляет то, что вы можете  в любую функцию, вместо  QString передать  QLatin1String ?

Компилятор ищет тот operator+, который может принять оба аргумента (с учетом приведения типов)
Знать бы еще какие operator+ вообще существуют ;D


Название: Re: QLatin1String operator+
Отправлено: zenden от Май 26, 2010, 14:12
QStringBuilder тут не причем. Пишем тестовый класс, и определим в нем только оператор QString. Заметьте, оператора+ в классе нет. А результат тот же.

Код
C++ (Qt)
class A
{
 public :
 int n;
 operator  const QString()
  {
   return QString::number(n);
  }
};
..
 
A c;
A d;
qDebug()<< (c+d);
 
 

А насчет перебора... вот скрин

(http://i.imgur.com/mcsGS.png) (http://i.imgur.com/c3aVm.png) 


Название: Re: QLatin1String operator+
Отправлено: Авварон от Май 26, 2010, 15:39
Код:
    qDebug() << typeid(QLatin1String("hello ") + QLatin1String("world")).name();
Запускается /Users/arch/cpp/Qt4/xxx...
7QString
/Users/arch/cpp/Qt4/xxx завершился с кодом 0


Название: Re: QLatin1String operator+
Отправлено: Sancho_s_rancho от Май 26, 2010, 18:48
QStringBuilder тут не причем. Пишем тестовый класс, и определим в нем только оператор QString. Заметьте, оператора+ в классе нет. А результат тот же.
С вашим примером все понятно. Но QLatin1String не возвращает QString. Так что пример немного не о том.


Название: Re: QLatin1String operator+
Отправлено: Alex Custov от Май 26, 2010, 19:13
Amigo_sa
Вас ведь не удивляет то, что вы можете  в любую функцию, вместо  QString передать  QLatin1String ?

Это потому что есть конструктор QString(QLatin1String).


Название: Re: QLatin1String operator+
Отправлено: ритт от Май 26, 2010, 19:17
зато есть QString::QString ( const QLatin1String & str ) ...


Название: Re: QLatin1String operator+
Отправлено: Sancho_s_rancho от Май 27, 2010, 09:27
Если дело в конструкторе, как вы говорите, который может принимать QLatin1String. То код на подобии

Код:
B();
    B(const A &aaa) {m_aaa=aaa;}
    const B operator+(const B &bbb) const {B b; return b;}
    B& operator=(const B &rhs) {m_aaa=rhs.m_aaa; return *this;}
    B& operator=(const A &rhs) {m_aaa=rhs; return *this;}
class A
{
public:
    A();
};
Должен спокойно складывать два объекта A, возвращая B, но как и ожидалось компилятор сказал:
error: no match for 'operator+' in 'a1 + a2'

Да и глупо было бы если бы такой код заработал.  Есть класс B::B(const A &aaa), потом сочинили еще класс С::С(const A &aaa) и D::D(const A &aaa) и в объект какого класса неявно преобразовать объект класса A?

Если я где-то неправ, то исправьте мой пример так, чтобы он повел себя как Qt-шный класс QLatin1String.


Название: Re: QLatin1String operator+
Отправлено: Авварон от Май 27, 2010, 11:20
прочти внимательно пост номер 9. Ты можешь конечно поспорить с компилятором, но он свято считает что тип суммы - QString (о чем и говорит typeid(...).name())


Название: Re: QLatin1String operator+
Отправлено: Sancho_s_rancho от Май 27, 2010, 12:18
прочти внимательно пост номер 9. Ты можешь конечно поспорить с компилятором, но он свято считает что тип суммы - QString (о чем и говорит typeid(...).name())
С компилятором и вами я полностью согласен. Оператор сложения возвращает QString. Но то, что это происходит из-за QString ( const QLatin1String & str ) без дополнительного шаманства я не согласен. Я привел тривиальный класс который имеет оператор сложения и конструктор , принимающий ссылку на другой класс. Это не делает чуда и объекты другого класса складываться не начинают.


Название: Re: QLatin1String operator+
Отправлено: Авварон от Май 27, 2010, 12:58
учите с++ (с)
Код:
class A
{
    int a;
public:
    A(){}

};

class B
{
    int b;
    A m_aaa;
public:
    B() {}
    B(const A &aaa) {m_aaa=aaa;}
    B& operator=(const B &rhs) {m_aaa=rhs.m_aaa; return *this;}
    B& operator=(const A &rhs) {m_aaa=rhs; return *this;}
    B& operator=( A &rhs) {m_aaa=rhs; return *this;}
};
const B operator+(const B &bbb1, const B &bbb2) {B b; return b;}


Название: [Решено]Re: QLatin1String operator+
Отправлено: Sancho_s_rancho от Май 27, 2010, 13:17
Спасибо, разобрался.