2014-11-19 2 views
0

Привет, я пытаюсь перегрузить оператор присваивания класса, чтобы вернуть член класса (данные).Оператор переопределения C++ = вызов метода ToInt()

class A{ 
public: 
    int32_t ToInt32() { return this->data; } 
    void SetData(int32_t data) { this->data=data; } 
private: 
    int32_t data; 
} 

Я хочу перегрузить оператор =, так что я могу сделать следующее:

A *a = new A(); 
a->SetData(10); 
int32_t Testint; 
Testint = a; 

и теперь a должны быть 10.

Как я могу это сделать?

+0

Вы не можете перегрузить 'operator =()' для примитивных типов. То, что вы можете сделать, это предоставить оператор литья для 'A', но назначение должно выглядеть так:' Testint = * a; ' –

ответ

1

Вы не можете сделать это, так как a - указатель. Вы можете перегружать операторов только для настраиваемых типов (и указатели не пользовательских типов).

Но при использовании указателя здесь все равно бессмысленно. Вы можете сделать следующую работу:

A a = A{}; 
a.SetData(10); 
int32_t Testint; 
Testint = a; 

Для того, чтобы сделать это, вы перегружать неявную конверсию-to-int32_t оператора, а не operator=:

public: 
    operator int32_t() const { return data; } 

Несколько слов о стиле коды: наличие сеттеров как правило, очень плохая идея - инициализируйте свой класс в конструкторе. И не объявляйте переменные без их инициализации. Таким образом, ваш код должен выглядеть примерно так:

A a = A{10}; 
int32_t Testint = a; 

... две строки вместо четырех. Определение A также упрощается:

class A { 
public: 
    A(int32_t data) : data{data} {} 

    operator int32_t() const { return data; } 

private: 
    int32_t data; 
}; 
+0

Это прекрасно работает, но мне нужно, чтобы это был указатель, потому что в моей программе у меня есть Массив указателей на объекты. Я беру элемент (указатель) массива и могу использовать функцию ToInt класса. Разве нет возможности сделать это с перегрузкой оператора? – Haselnussstrauch

+0

@ Haselnussstrauch, как я сказал, это невозможно. Кроме того, ** вам почти наверняка не нужно использовать указатели ** в массиве, и вы не должны их использовать. Указатели чрезвычайно сильно используются в C++. –

+0

'A * a = new A;' 'int32_t Testint = * a;' works – Haselnussstrauch

0

Вам необходимо предоставить оператор преобразования:

class A{ 
... 
    operator int32_t() const 
    { 
     return this->data; 
    } 
}; 

реализуется Любой оператор преобразования как:

operator DATATYPE() 
{ 
    return ...; 
} 

Возвращаемый тип такого оператора преобразования является DATATYPE сам (а значит int32_t в коде, приведенном выше) , Поскольку этот оператор преобразования не (не должен) изменять содержимое этого экземпляра, он должен быть объявлен const.