Russian Qt Forum

Qt => Общие вопросы => Тема начата: Егор от Декабря 24, 2014, 18:28



Название: Не получается изменить значение переменной
Отправлено: Егор от Декабря 24, 2014, 18:28
Всё это, конечно, очень смешно, но не могу изменить значение private переменной.
Есть класс Element, в котором объявлены private переменные:
Код:
private:
    int direction, coordX, coordY;
В другом классе Snake создаётся объект класса Element, который помещается в список elements:
Код:
elements.insert(0, Element(2, 5, 1));
Получить данные я могу, а вот изменить их значения - нет. Вот код метода и его вызова:
Код:
void setX(int value);
______________________________
void Element::setX(int value){
    coordX=value;
}
______________________________
snake->getElement(i).setX(snake->getElement(i).getX()+1);   //Метод getElement возвращает i-й элемент списка, тоесть, объект типа Element. Пытался даже передать туда обычное число, всё равно не меняется.
В чём, *****, дело)?


Название: Re: Не получается изменить значение переменной
Отправлено: gil9red от Декабря 24, 2014, 18:33
А покажите get-функцию


Название: Re: Не получается изменить значение переменной
Отправлено: Егор от Декабря 24, 2014, 18:38
А покажите get-функцию
Код:
int Element::getX(){
    return coordX;
}

Я даже пытался отправить туда просто число. Это тоже не сработало.


Название: Re: Не получается изменить значение переменной
Отправлено: kambala от Декабря 24, 2014, 18:40
snake->getElement(i) возвращает копию объекта Element


Название: Re: Не получается изменить значение переменной
Отправлено: Егор от Декабря 24, 2014, 18:43
snake->getElement(i) возвращает копию объекта Element
Через указатель сделать, или просто сделать список public и обращаться непосредственно к элементу списка?

P.S указатель не дал результата, хотя, скорее всего, я где-то опять ошибся.


Название: Re: Не получается изменить значение переменной
Отправлено: kambala от Декабря 24, 2014, 19:34
через указатель должно правильно работать. можешь и класс змеи показать.


Название: Re: Не получается изменить значение переменной
Отправлено: Егор от Декабря 24, 2014, 19:42
через указатель должно правильно работать. можешь и класс змеи показать.
Код:
#ifndef SNAKE_H
#define SNAKE_H
#include <QPixmap>
#include "element.h"

class Snake
{
public:
    //QList<Element> elements;
    Snake(QString wayToFile);
    QPixmap getElementPix();
    int getLength();
    Element getElement(int index);
    ~Snake();

private:
    QPixmap elementPix;
    int length;
    int speed;
    QList<Element*> elements;
};

#endif // SNAKE_H

________________________________________________________________--
#include "snake.h"

Snake::Snake(QString wayToFile):
    elementPix(QPixmap(wayToFile)),
    length(3)
{
    elements.insert(0, new Element(2, 5, 1));
    elements.insert(1, new Element(1, 5, 1));
    elements.insert(2, new Element(0, 5, 1));
}

QPixmap Snake::getElementPix(){
    return elementPix;
}

int Snake::getLength(){
    return length;
}

Element Snake::getElement(int index){
    return *elements[index];
}

Snake::~Snake()
{
}



Название: Re: Не получается изменить значение переменной
Отправлено: kambala от Декабря 24, 2014, 19:43
Element *Snake::getElement(int index){
    return elements[index];
}


Название: Re: Не получается изменить значение переменной
Отправлено: Егор от Декабря 24, 2014, 19:55
Element *Snake::getElement(int index){
    return elements[index];
}
Большое спасибо, всё нормально работает. А подобное написание метода я вообще видел впервые, так что за новые знания тоже спасибо.


Название: Re: Не получается изменить значение переменной
Отправлено: kambala от Декабря 24, 2014, 19:58
тут же ничего такого нету: просто возвращаешь указатель на элемент. можно например и так писать: Element* Snake::getElement(int index){


Название: Re: Не получается изменить значение переменной
Отправлено: Егор от Декабря 25, 2014, 18:22
тут же ничего такого нету: просто возвращаешь указатель на элемент. можно например и так писать: Element* Snake::getElement(int index){
Ну, просто раньше как-то не приходилось возвращать указатели. А сам я пробовал вернуть, написав *elements[index].


Название: Re: Не получается изменить значение переменной
Отправлено: gil9red от Декабря 25, 2014, 18:30
тут же ничего такого нету: просто возвращаешь указатель на элемент. можно например и так писать: Element* Snake::getElement(int index){
Ну, просто раньше как-то не приходилось возвращать указатели. А сам я пробовал вернуть, написав *elements[index].

Через * возвращалась копия объекта.
У вас в списке хранятся указатели на объект, поэтому * была лишняя. Да и семантика функции подразумевала возврат объекта, а не указателя на него :)


Название: Re: Не получается изменить значение переменной
Отправлено: Егор от Декабря 26, 2014, 15:34
тут же ничего такого нету: просто возвращаешь указатель на элемент. можно например и так писать: Element* Snake::getElement(int index){
Ну, просто раньше как-то не приходилось возвращать указатели. А сам я пробовал вернуть, написав *elements[index].

Через * возвращалась копия объекта.
У вас в списке хранятся указатели на объект, поэтому * была лишняя. Да и семантика функции подразумевала возврат объекта, а не указателя на него :)
Да, теперь я всё понял. Спасибо за пояснение.