Как неявно конвертировать объекты Qt в QString? - PullRequest
4 голосов
/ 26 января 2011

Каков наилучший способ заставить все из приведенного ниже кода работать стандартным способом C ++ / Qt?

class A {
public:
    A() { }
    virtual ~A() { }
    virtual QString toString() { return "A"; }
};

class B: A {
public:
    B() { }
    ~B() { }
    QString toString() { return "B"; }
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    A a_;
    B b_;

    // qDebug() << a_;  // I can make this work by overloading << yes?
    // qDebug() << b_;

    // QString x = a_;  // How do I make this work?
    // QString y = b_;

    QString s = a_.toString(); // What I'm doing at present
    qDebug() << b_.toString(); // What I'm doing at present

    return a.exec();
}

У меня есть иерархия экземпляров моих собственных классов Qt, которые все происходят из одного базового класса. Я хотел бы превратить их в строки неявным образом стандартным способом для отображения в Qt ui:

Я могу сделать это сам, как указано выше, с помощью моего собственного стандартного метода, такого как toString выше, но он не является неявным, и я предпочел бы следовать соглашению Qt или C ++, так как считаю, что есть один, о котором я не знаю.

Строки будут в конечном итоге отображаться в Q * Просмотр элементов управления, что, я считаю, означает, что перегрузка operator << сама по себе будет недостаточной.

1 Ответ

13 голосов
/ 26 января 2011

Вы просто добавляете так называемую функцию преобразования :

struct foo
{
    operator int() { return 5; }
};

foo f;
int i = f; // uses operator to convert to int

Так что в вашем случае просто замените virtual QString toString() на virtual operator QString().


Тем не менее, неявные операторы обычно не одобряются. Мало того, что броски осуждаются, но теперь вы позволяете произнесению происходить неявно. C ++ 0x фактически позволяет нам привязать explicit к функциям преобразования, чтобы убедиться, что мы явно приводим, но я не знаю, какие компиляторы поддерживают это.

Я думаю, вам будет гораздо лучше оставить то, что у вас есть, и просто добавить:

// I assume qDebug() is convertible to std::ostream
std::ostream& operator<<(std::ostream& stream, const A& val)
{
    stream << val.toString(); // would need to make function const, of course

    return stream;
}

И оставляя все остальное в явном виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...