Перегрузка перегруженного оператора =? - PullRequest
1 голос
/ 16 августа 2010

Что я могу сделать, когда мне нужно выполнить другую работу, в зависимости от типа rval и lval? Определение нескольких перегрузок появляется с ошибкой 'operator = is ambiguous'.

Любые идеи или советы (ссылки на учебные пособия) очень ценятся, поскольку я только сегодня узнал о перегрузке операторов.

Заранее спасибо!

EDIT:

Да, я бы использовал C ++ 0x, поскольку он у меня есть, просто я не понимаю, как это повлияет на код?

Это два случая, в которых я использую его atm, если я хорошо его понимаю, lval отличается, поэтому они узнаваемы. Цель - преобразование в соответствующий тип.

int wrapint::operator=(int)
{
    return m_iCurrentNumber;
}

void wrapint::operator=(const int& rhs)
{
    m_iCurrentNumber = rhs;
}

Ответы [ 2 ]

2 голосов
/ 16 августа 2010

Для ситуации wrapint = wrapint:

wrapint& wrapint::operator=(const wrapint& rhs)
{
    // test for equality of objects by equality of address in memory
    // other options should be considered depending on specific requirements
    if (this == &rhs) return *this;

    m_iCurrentNumber = rhs.m_iCurrentNumber;

    return *this;
}

Я должен сказать, что приведенное выше является правильной подписью для оператора присваивания.Я думаю, что предоставленные вами подписи неверны, или, по крайней мере, я никогда не видел такого в своем опыте работы с C ++.

Если вы хотите преобразовать из int в wrapint ив противном случае вы должны предоставить следующее:

1) из int в wrapint - правильный конструктор, который позволит неявное преобразование из int;в качестве стороны примечание вы должны действительно убедиться, что поведение подразумевается и находится в пределах проблемы при работе с такими неявными преобразованиями (посмотрите на явное ключевое слово C ++ для дальнейшего "просветления")

2) от wrapint до int - правильный оператор приведения

Ниже приведен пример:

#include <iostream>

class wrapint
{ 
public:
   wrapint() : m_iCurrentNumber(0)
   { 

   }

   // allow implicit conversion from int
   // beware of this kind of conversions in most situations
   wrapint(int theInt) : m_iCurrentNumber(theInt)
   { 

   }

   wrapint(const wrapint& rhs) 
   {
    if (this != &rhs) 
        this->m_iCurrentNumber = rhs.m_iCurrentNumber; 
   }

   wrapint& operator=(const wrapint& rhs);

   operator int ()
   {
        return m_iCurrentNumber;
   }

 private:
     int m_iCurrentNumber;
 };

 wrapint& wrapint::operator=(const wrapint& rhs)
 {
     // test for equality of objects by equality of address in memory
     // other options should be considered depending on specific requirements
     if (this == &rhs) return *this;

     m_iCurrentNumber = rhs.m_iCurrentNumber;
     return *this;
 }

 using namespace std;

 int main()
 {
     // this will be initialized to 0
     wrapint theOne;
     // this will be 15
     wrapint theOtherOne = 15;

     cout << "The one: " << theOne << "\n";
     cout << "The other one: " << theOtherOne << "\n";

     theOne = theOtherOne;

     int foobar = theOne;
     // all should be 15
     cout << "The one: " << theOne << "\n";
     cout << "The other one: " << theOtherOne << "\n";
     cout << "The foobar: " << foobar << "\n";
     return 0;
 }
1 голос
/ 16 августа 2010

operator= предполагается изменить левое значение, а левое значение должно быть типа класса.Возвращаемое значение (обычно *this) в основном игнорируется, за исключением случаев, когда вы связываете назначения / другие вызовы функций (например, a = b = c;, где результат b = c присваивается a).

Если выхотите иметь возможность присваивать wrapint встроенному int, тогда это может быть достигнуто путем определения оператора приведения для wrapint

wrapint::operator int() const { return m_iCurrentNumber; }

Теперь wrapint будет неявно преобразованодля int, когда вы пытаетесь присвоить его для int.

int a;
wrapint w;
a = w;  //== a = w.operator int() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...