Можно ли присвоить объект int?

У меня есть класс CCounter, который содержит целочисленное значение, защищенное мьютексом. Я определил несколько операторов, таких как post/pre inc/dec, возвращающих целое число, поэтому я могу сделать:

CCounter c(10);
int i = c++;

но что мне делать с простым присваиванием вроде i = c ? Я попытался определить оператор друга =, но это дает мне

operator=(int&, const CCounter&)’ must be a nonstatic member function

ошибка. Пожалуйста, порекомендуйте. Спасибо.


person jackhab    schedule 15.07.2009    source источник
comment
Помимо решений, другие писали: вы должны сделать возвращаемые значения ваших операторов ++/-- CCounter &/CCounter, а не int!   -  person mmmmmmmm    schedule 15.07.2009


Ответы (7)


Вам нужно определить оператор приведения, который приводит от CCounter к int. Добавьте этого члена в свой класс:

operator int() const {
  return ...;
}
person Martin Liversage    schedule 15.07.2009
comment
Привет, я сделал это, но получил: ошибка: невозможно преобразовать «CircularInt» в «int» при инициализации int i = hour; Есть ли у вас какие-либо идеи? - person Tomer; 29.04.2018
comment
@Tomer: К сожалению, я не могу ответить на ваш вопрос. Что такое CircularInt и как ваша проблема связана с моим ответом? Возможно, вам следует задать новый вопрос, где вы описываете детали своей проблемы? - person Martin Liversage; 29.04.2018

Как вы уже выяснили, оператор присваивания должен быть функцией-членом класса. Поскольку целые числа не являются классами, вы не можете написать для них operator=(). Альтернативой, как указывали другие, является написание функции, которая преобразуется в int. Я настоятельно рекомендую вам написать для этого именованную функцию, например ToInt(), а не использовать оператор преобразования, который может быть источником неочевидных ошибок.

person Community    schedule 15.07.2009
comment
+1 за объяснение, почему оператор = нельзя использовать, и за подсказку о явной функции. Идите дальше, чем фрагмент кода... (Я сделал это, позор мне :)) - person neuro; 15.07.2009
comment
И я бы порекомендовал ему сделать возвращаемые значения его операторов inc/dec CCounter &/CCounter, а не int! - person mmmmmmmm; 15.07.2009

Добрый день,

Разве вы не должны вместо этого определять функцию доступа, если вы просто «получаете» текущее значение счетчика?

Что-то вроде:

int GetCounter();

Все остальное как бы маскирует намерение того, что вы пытаетесь сделать. ИМХО Натч! (-:

ХТН

ваше здоровье,

person Rob Wells    schedule 15.07.2009

Вам нужно определить operator int(), чтобы разрешить преобразование вашего класса в int. Например:

class CCounter
{
    public:
    CCounter(int val) : m_val(val)
    {
    }

     operator int() const
    {
        return m_val;
    }

    private:
    int m_val;
};





int main(int argc,char *argv[])
{
    CCounter c(10);
    int n = c;

    std::cout<<n<<"\n";

    return 0;
}  
person Naveen    schedule 15.07.2009

Как сказано, используйте оператор int(). Вот фрагмент кода:

#include <iostream>

class CCounter
{
    public:
    CCounter(int i = 0) : _count(i) {}
    operator int() { return _count; }

    private:
    int _count;

};

int main()
{
    CCounter counter(4);
    int c = counter;
    std::cout << "Counter = " << c << std::endl;

    return 0;
}
person neuro    schedule 15.07.2009

Вы сказали:

«Я определил несколько операторов, таких как post/pre inc/dec, возвращающих целое число».

Теперь, когда другие ответы предоставили вам общий способ преобразования объекта в целое число, я бы рекомендовал вам изменить эти другие операторы, чтобы они вели себя как обычно.

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

CCounter& operator++() {
    ++m_val;
    return *this;
}

CCounter operator++(int) {
    CCounter tmp(*this);
    ++m_val;
    return tmp;
}
person Ropez    schedule 15.07.2009

Хотя вам было предоставлено действительное решение , я бы также подумал о простом создании нормальной функции, возвращающей int, такой как int GetValue() const, чтобы улучшить читаемость и упростить обслуживание. Конечно, это очень субъективно.

person Daniel Daranas    schedule 15.07.2009