LINUX.ORG.RU

При передаче константного объекта по ссылке в функцию, в теле функции не возможно брать из него данные

 , ,


1

2

имеется пример:

#include <iostream>

using namespace std;

class Number
{
private:
    int number = 0;

public:
    int getNumber ()
    {return number;}

    void setNumber(const int number)
    {
        this->number = number;
    }

    Number & operator= (const Number &number)
    {
        this->number = number.number;
        return *this;
    }
};

class TwoNumbers
{
private:
    Number num1, num2;

public:
    void getNumbers(Number &num1, Number &num2)
    {
        num1 = this->num1;
        num2 = this->num2;
    }

    void setNumbers (const int num1, const int num2)
    {
        this->num1.setNumber(num1);
        this->num2.setNumber(num2);
    }
};

void upup (const TwoNumbers &numbers)
{
    Number a,b;

    numbers.TwoNumbers::getNumbers(a,b);

    cout << a.getNumber() << endl << b.getNumber() << endl;
}

int main()
{
    TwoNumbers c;
    c.setNumbers(1,2);

    upup(c);

    return 0;
}


в таком виде выдает ошибку:
../Test/main.cpp:49:39: error: passing ‘const TwoNumbers’ as ‘this’ argument discards qualifiers [-fpermissive]
     numbers.TwoNumbers::getNumbers(a,b);
                                       ^


если в функции upup() поставить входящий параметр не константу, то все начинает работать...
однако, мне необходимо, что бы данный параметр не изменялся, т.к. он же передан по ссылке.

не могу понять почему так происходит?

и еще — почему то если константу не убирать в параметре описания функции, то qt creator отказывается видить методы данного объекта (const TwoNumbers &numbers), однако видит их через два двоеточия и класс.

★★

Последнее исправление: safocl (всего исправлений: 3)

В Свифте, кстати, тоже засада с конст, не конст. Там ещё надо помнить, что некоторые типы данных - ссылочные, а некоторые - по значению. Отсюда поведение при конст разное.

Пример:


struct a {
   var b = 0 
} 

class c {
   public var b = 0 
} 

func SomeFunc() {
   let d:a
   let e:c

   // нельзя, константный объект, 
   // структуры передаются по значению 
   d.b = 1
   

   // можно, константная только ссылка 
   e.b = 1
}

hibou ★★★★★
()
Последнее исправление: hibou (всего исправлений: 1)
Ответ на: комментарий от nebanbmenyapls
#include <iostream>

using namespace std;

struct myClass
{
    int x;
};

void foo(const myClass &obj)
{
    obj.x = 5;
}

int main()
{
    myClass obj;
    obj.x = 1;
    foo(obj);
    cout << obj.x << endl;
    return 0;
}



вызывает ошибку:
main.cpp:13:13: ошибка: присваивание элементу «myClass::x» в объекте, доступном только на чтение
obj.x = 5;
______^

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 4)
Ответ на: комментарий от hibou

Типичный недоязычок. Ну хоть «нессылочные» типы данных добавили, а то хомячки слишком плохо могут в ссылки, а жс-концепция «всё ссылка» целиком и полностью несостоятельна.

nebanbmenyapls
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.