Russian Qt Forum
Ноябрь 23, 2024, 11:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО]QLatin1String operator+  (Прочитано 9594 раз)
Sancho_s_rancho
Гость
« : Май 26, 2010, 12:39 »

Почему следующий код работает?
Код:
static const char a[]="aaa";
    static const char b[]="bbb";

    qDebug() << (QLatin1String(a)+QLatin1String(b));
У класса QLatin1String ведь нет оператора сложения.
« Последнее редактирование: Май 27, 2010, 13:18 от Sancho_s_rancho » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Май 26, 2010, 13:00 »

зато есть QString::QString ( const QLatin1String & str ) можен он срабатывает?
Записан
zenden
Гость
« Ответ #2 : Май 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; }
Записан
Sancho_s_rancho
Гость
« Ответ #3 : Май 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 )
А с оператором сложения - несовсем.
« Последнее редактирование: Май 26, 2010, 13:34 от Sancho_s_rancho » Записан
Amigo_sa
Гость
« Ответ #4 : Май 26, 2010, 13:45 »

Если куте собрана в дебаге, то можно пропробовать в отладчике посмотреть какой оператор выполняется...
Записан
zenden
Гость
« Ответ #5 : Май 26, 2010, 13:52 »

Amigo_sa
ну на то у С++ и самые сложные компиляторы среди ЯП, чтобы решать подобные задачки.
Вас ведь не удивляет то, что вы можете  в любую функцию, вместо  QString передать  QLatin1String ?

Компилятор ищет тот operator+, который может принять оба аргумента (с учетом приведения типов)
Записан
Sancho_s_rancho
Гость
« Ответ #6 : Май 26, 2010, 14:00 »

Amigo_sa
ну на то у С++ и самые сложные компиляторы среди ЯП, чтобы решать подобные задачки.
Вас ведь не удивляет то, что вы можете  в любую функцию, вместо  QString передать  QLatin1String ?

Компилятор ищет тот operator+, который может принять оба аргумента (с учетом приведения типов)
Все-таки компилятор C++ это не некий черный ящик который что-то прикидывает и куда-то что-то запихивает. Есть стандарт ISO/IEC 14882:2003 Programming Language C++.
Насколько я понял ответ на мой вопрос лежит в классе QStringBuilder
Записан
Amigo_sa
Гость
« Ответ #7 : Май 26, 2010, 14:07 »

Amigo_sa
ну на то у С++ и самые сложные компиляторы среди ЯП, чтобы решать подобные задачки.
Вас ведь не удивляет то, что вы можете  в любую функцию, вместо  QString передать  QLatin1String ?

Компилятор ищет тот operator+, который может принять оба аргумента (с учетом приведения типов)
Знать бы еще какие operator+ вообще существуют Смеющийся
Записан
zenden
Гость
« Ответ #8 : Май 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);
 
 

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

 
« Последнее редактирование: Май 26, 2010, 14:15 от zenden » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Май 26, 2010, 15:39 »

Код:
    qDebug() << typeid(QLatin1String("hello ") + QLatin1String("world")).name();
Запускается /Users/arch/cpp/Qt4/xxx...
7QString
/Users/arch/cpp/Qt4/xxx завершился с кодом 0
Записан
Sancho_s_rancho
Гость
« Ответ #10 : Май 26, 2010, 18:48 »

QStringBuilder тут не причем. Пишем тестовый класс, и определим в нем только оператор QString. Заметьте, оператора+ в классе нет. А результат тот же.
С вашим примером все понятно. Но QLatin1String не возвращает QString. Так что пример немного не о том.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Май 26, 2010, 19:13 »

Amigo_sa
Вас ведь не удивляет то, что вы можете  в любую функцию, вместо  QString передать  QLatin1String ?

Это потому что есть конструктор QString(QLatin1String).
Записан
ритт
Гость
« Ответ #12 : Май 26, 2010, 19:17 »

зато есть QString::QString ( const QLatin1String & str ) ...
Записан
Sancho_s_rancho
Гость
« Ответ #13 : Май 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:Веселый(const A &aaa) и в объект какого класса неявно преобразовать объект класса A?

Если я где-то неправ, то исправьте мой пример так, чтобы он повел себя как Qt-шный класс QLatin1String.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #14 : Май 27, 2010, 11:20 »

прочти внимательно пост номер 9. Ты можешь конечно поспорить с компилятором, но он свято считает что тип суммы - QString (о чем и говорит typeid(...).name())
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.152 секунд. Запросов: 23.