2009-07-15 5 views
4

У меня есть класс CCounter, который содержит и целое значение, защищенное мьютексом. Я определил несколько операторов, таких как пост/пред INC/DEC возвращающего целого числа, так что я могу сделать:Можно ли присвоить объект int?

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

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

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

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

+1

Помимо решений остальные писали: Вы должны возвращаемые значения вашего ++/- операторы CCounter и/CCounter и не Int! – mmmmmmmm

ответ

16

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

operator int() const { 
    return ...; 
} 
1

Вам нужно определить operator 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; 
} 
1

G'day,

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

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

int GetCounter(); 

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

НТН

веселит,

7

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

+0

+1 для объяснения причин, почему оператор = не может использоваться, и для подсказки явной функции. Идите дальше, чем фрагмент кода ... (я сделал это, позор мне :)) – neuro

+0

И я бы рекомендовал ему сделать возвращаемые значения своих операторов inc/dec CCounter &/CCounter, а не int! – mmmmmmmm

1

Как сказано, используйте оператор 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; 
} 
0

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

1

Вы сказали:

"Я определил несколько операторов, таких как пост/пред INC/DEC возвращающихся целое".

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

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

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

CCounter operator++(int) { 
    CCounter tmp(*this); 
    ++m_val; 
    return tmp; 
} 
0
#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(); 
} 
Смежные вопросы