Qt4 C ++ Указатель на константный QList указателей - PullRequest
0 голосов
/ 12 октября 2010

Я застрял с указателем на const QList of pointers to Foo.Я передаю указатель на myListOfFoo с Bar объекта на Qux.Я использую указатель на const, чтобы предотвратить внесение каких-либо изменений вне класса Bar.Проблема в том, что я все еще могу изменить ID_ выполнение setID в Qux::test().

#include <QtCore/QCoreApplication>
#include <QList>
#include <iostream>

using namespace std;

class Foo
{
private:
    int      ID_;
public:
    Foo(){ID_ = -1; };
    void setID(int ID) {ID_ = ID; };
    int  getID() const {return ID_; };
    void setID(int ID) const {cout << "no change" << endl; };
};

class Bar
{
private:
    QList<Foo*>  *myListOfFoo_;
public:
    Bar();
    QList<Foo*> const * getMyListOfFoo() {return myListOfFoo_;};
};

Bar::Bar()
{
    this->myListOfFoo_ = new QList<Foo*>;
    this->myListOfFoo_->append(new Foo);
}

class Qux
{
private:
    Bar *myBar_;
    QList<Foo*> const* listOfFoo;
public:
    Qux() {myBar_ = new Bar;};
    void test();
};

void Qux::test()
{
    this->listOfFoo = this->myBar_->getMyListOfFoo();
    cout << this->listOfFoo->last()->getID() << endl;
    this->listOfFoo->last()->setID(100); //           **<---- MY PROBLEM**
    cout << this->listOfFoo->last()->getID() << endl;
}

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

    Qux myQux;
    myQux.test();

    return a.exec();
}

Результат приведенного выше кода:

-1
100

я пытаюсь достичь:

-1
no change
-1

Нет такой проблемы, когда я использую QList<Foo> вместо QList<Foo*>, но мне нужно использовать QList<Foo*> в моем коде.Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 12 октября 2010

Вы можете использовать QList<Foo const *> const *, что означает, что вы не можете изменять список или его содержимое. Проблема в том, что нет простого способа получить этот список из QList<Foo*>, поэтому вам нужно добавить его в свой класс Bar.

1 голос
/ 12 октября 2010

должно быть:

QList<const Foo *>* listOfFoo;
0 голосов
/ 15 октября 2010

Если вам действительно нужно вернуть указатель, приведите его к QList, содержащему указатели на постоянные элементы:

QList<const Foo*> const* getMyListOfFoo() 
{return reinterpret_cast<QList<const Foo*> *>(myListOfFoo_);};

В Qux listOfFoo также должен содержать указатели на постоянные элементы:

QList<const Foo*> const* listOfFoo;
...