Доступ к членам класса QList Pointer

У меня есть этот проект, в котором я использую QList для хранения экземпляров класса с именем RespirationTest. Доступ к членам RespirationTest прост при использовании динамической памяти, но у меня возникли проблемы, так как я переключил свой QList на указатель

//class declaration

class RespirationTest: public QListWidgetItem
{

public:
    RespirationTest();
    ~RespirationTest();

public slots:
double GetAmplitude() { return _amplitude; }

private:
double _amplitude;
}

Проблема здесь, когда я пытаюсь получить доступ к членам моих объектов QList (используется для работы, когда respTest был QList)

//MainWindow

QList<RespirationTest> * respTests;

respTests = new QList<RespirationTest>;

void MainWindow::on_load_button_clicked()
{
RespirationTest *currTest = new RespirationTest;
respTests->push_back(*currTest);
qDebug() << "ampl" << i << ": " << respTests[i].GetAmplitude(); // no member named 'GetAmplitude'
}

person JCSB    schedule 30.06.2020    source источник


Ответы (2)


Быстрое исправление: используйте вместо этого .at(int idx):

qDebug() << "ampl" << i << ": " << respTests->at(i).GetAmplitude();

Проблема с использованием operator[] заключается в том, что вы получаете доступ к памяти указателя вместо доступа к базовому QList:

respTests[i] // returns the QList<> instance at `i` instead
             // of a `RespirationTest` object

Поэтому, если вы хотите продолжать использовать [], вам нужно будет дополнительно получить доступ к ith элементу, используя [] или .at():

qDebug() << "ampl" << i << ": " << respTests[0].at(i).GetAmplitude();

Я настоятельно рекомендую использовать .at(), если вам действительно это нужно сделать. В противном случае просто не используйте указатели вообще, так как это слишком усложняет проблему и может привести к утечке памяти. Кроме того, избегайте QList<>, вместо этого используйте QVector.

person Waqar    schedule 30.06.2020

поскольку respTests - это указатель, вам нужно использовать -> вместо .

qDebug() << "object at " << i << ": " << respTests->at(i).GetAmplitude();
person ΦXocę 웃 Пepeúpa ツ    schedule 30.06.2020
comment
respTests[0]->at(i) не будет компилироваться. - person Waqar; 30.06.2020
comment
@Waqar Привет, чувак!! большое спасибо!!!!, моя ошибка, но сейчас отредактировано и проверено... - person ΦXocę 웃 Пepeúpa ツ; 30.06.2020