Можно ли присвоить объект int? - PullRequest
5 голосов
/ 15 июля 2009

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

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

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

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

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

Ответы [ 8 ]

17 голосов
/ 15 июля 2009

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

operator int() const {
  return ...;
}
8 голосов
/ 15 июля 2009

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

1 голос
/ 15 июля 2009

Вы сказали:

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

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

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

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

CCounter operator++(int) {
    CCounter tmp(*this);
    ++m_val;
    return tmp;
}
1 голос
/ 15 июля 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;
}
1 голос
/ 15 июля 2009

G'day,

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

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

int GetCounter();

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

НТН

ура

1 голос
/ 15 июля 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;
}  
0 голосов
/ 17 февраля 2017
#include<iostream>
using namespace std;

class CA {
public:
    int a;
    CA(int x):a(x)
    {

    }
    operator int() const {
        return a;
    }

    void operator ()() {

    }
};

void main(){

    CA obj = 100;
    int k = obj;
    obj();
}
0 голосов
/ 15 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...