2012-02-17 128 views
0

该代码被写入以实现具有一些常用功能的Bit类。C++代码错误

#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. 

我怎么能删除错误?

回答

4

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); 

,如果你真的想。

+0

如果我将构造函数更改为'Bit(Bit b) { value = b.value; width = b.width; } '为什么这里错了,但它在java中完美工作。 – 2012-02-17 14:02:47

+2

复制构造函数必须通过引用采用其参数;为了按值传递它,你需要拷贝构造函数来创建值 - 这是不可能的,因为这是*拷贝构造函数。在Java中,参数是一个参考 - 你不能通过值传递类类型。在C++中,你必须声明它是一个引用,'Bit(Bit const&b)'。 – 2012-02-17 14:08:15

2

您的“”方法返回“Bit * const”。我想整个方法应该是

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

方法plus(int newval)应该返回*this;而不是this。这是错误。也返回值类型Bit&(参考)会更有意义。尽管您可能不需要返回对您用来调用此方法的对象的引用(请检查Mike的答案)。

另请注意,pow(2,width)等于(1 << width)

+0

你说得对。但我想知道为什么我们需要指针?我听说“this”是一个指针,那么为什么我们需要添加另一个指针呢?我是C++的新手,你能否解释一下? – 2012-02-17 14:05:36

+0

@RasmiRanjanNayak:你没有*“添加另一个指针”*,你正在取消现有的指针。 – LihO 2012-02-17 14:10:18

1

如果你可以添加行号,或者只是在失败的地方给出函数,那会很好。但是,这似乎是停止的地方。

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

事情是,这是一个指向对象的指针。这意味着这实际上是一个Bit *。既然你想返回一个Bit,这会在你描述的时候产生一个失败。要解决此问题,您可以将其更改为:

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

这将返回对已更新对象的引用。你当然也可以返回一个Bit*,但我会尽量避免不必要地使用指针。

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

这个methot返回一个Bit,但你返回一个指向Bit的指针。 您应该返回: return *this,或方法签名应该是Bit* plus(int newval)(如果您决定返回“本”)