Ошибка в коде C ++ - PullRequest
       30

Ошибка в коде C ++

0 голосов
/ 17 февраля 2012

Код написан для реализации класса Bit с некоторыми общими функциями.

#include <iostream>
#include <math.h>
using namespace std;

class Bit
{ 
    int width;
    int value;
    public:
        Bit(int v, int w)
        {
            value=v;
            width=w;
        }
        Bit(const Bit& b)
        {
            value= b.value;
            width= b.width;
        }
        int getWidth()
        {
            return width;
        }
        int getValue()
        {
            return value;
        }
        Bit plus(int newval)
        {
            value+=newval;
            if(value>=pow(2,width))
            cout<<"Overflow";
            return this;
        }
};

Сообщение об ошибке:

Conversion from 'Bit* const' to non-scalar type 'Bit' requested.

Как я могу удалить ошибку?

Ответы [ 6 ]

4 голосов
/ 17 февраля 2012

this - указатель, а ваша функция plus объявляет, что возвращает значение.

Возможно, вы хотите изменить тип возвращаемого значения на void и ничего не возвращать; Я не вижу веской причины для возврата копии объекта.

Возможно, вы хотите вернуть ссылку для цепочки вызовов:

Bit & plus(int newval)        //< added &
{
    value+=newval;
    if(value>=pow(2,width))
        cout<<"Overflow";
    return *this;             //< added *
}

теперь вы можете написать:

bit.plus(1).plus(3).plus(42);

если вы действительно хотите.

3 голосов
/ 17 февраля 2012

Метод plus(int newval) должен вернуть *this; вместо this. Это ошибка. Также возвращаемое значение типа Bit& (ссылка) будет иметь больше смысла. Хотя вам, вероятно, не нужно возвращать ссылку на объект, который вы использовали для вызова этого метода (проверьте ответ Майка).

Также обратите внимание, что pow(2,width) равно (1 << width).

2 голосов
/ 17 февраля 2012

Ваш метод " plus " возвращает "Bit * const".Я думаю, что весь метод должен быть

Bit& plus(int newval)
{
 value+=newval;
 if(value>=pow(2,width))
 cout<<"Overflow";
 return *this;
}
1 голос
/ 17 февраля 2012

Было бы неплохо, если бы вы могли добавить номер строки или просто дать функцию, где она выходит из строя.Тем не менее, это, кажется, где он останавливается.

Bit plus(int newval)
{
 value+=newval;
 if(value>=pow(2,width))
 cout<<"Overflow";
 return this;
}

Дело в том, что это указатель на объект.Это означает, что это на самом деле Bit *.Поскольку вы хотите вернуть бит, это создаст ошибку, как вы описываете.Чтобы исправить это, вы можете изменить его на:

Bit& plus(int newval)
{
  value+=newval;
  if(value>=pow(2,width))
    cout<<"Overflow";
  return *this;
}

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

1 голос
/ 17 февраля 2012
Bit & plus(...) { ... return *this; }
0 голосов
/ 17 февраля 2012
Bit plus(int newval)
{
 value+=newval;
 if(value>=pow(2,width))
 cout<<"Overflow";
 return this;
}

Этот метод возвращает бит, но вы возвращаете указатель на бит.Вы должны вернуть: return *this, или подпись метода должна быть Bit* plus(int newval) (если вы решили вернуть "this")

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