2014-10-05 98 views
1

以下代码是Distance类的一部分。运算符重载是一个朋友函数,声明为Distance类的私有成员,我尝试调用的函数是公共成员。此函数不会更改Distance类的成员变量。从朋友函数内的对象访问成员函数

我试图保持两个引用参考对象d1和d2不变,但我的编译器说我通过调用ConvertToInches函数或位于距离类内的任何函数来违反它们的const属性,尽管这些函数不改变Distance类中的私有变量。

当我不使d1和d2保持不变时,编译器没有问题。

任何人都可以解释如何让d1和d2不断调用这个函数,为什么我不工作?

谢谢!

const Distance operator+(const Distance& d1, const Distance d2) 
//this is a friend function 
//declared in private section of Distance class 
{ 
    //this function is what causes problems !!!!!!! 
    d1.ConvertToInches(1, 2, 3, 4); 

    Distance d3 = 3; 
    return d3; 
} 

Distance::ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) 
//declared in public section of Distance class 
{ 
    cMiles = cMiles * 63360; 
    cYards = cYards *36; 
    cFeet = cFeet * 12; 

    int cSum = cMiles + cYards + cFeet + cInches; 
    return cSum; 
} 
+0

我不知道为什么@CIsForCoocckies删除了答案:根据你的'ConvertToInches'声明,它是一个非const成员函数。这些可能不会被称为'const'对象,例如朋友'operator +'的参数。 – dyp 2014-10-05 01:06:47

+0

或者'ConvertToInches'是一个'static'成员函数吗? (从你所展示的代码片段中不清楚)在任何情况下,如果它不访问任何数据成员或'Distance'的私有成员,那么没有理由为什么它应该是成员函数,静态的。 – dyp 2014-10-05 01:12:08

回答

1

的问题是,ConvertToInches方法不声明为const,而你试图调用一个const距离&对象的方法。一个简单的解决方法是常量添加到声明和函数的定义:与您的代码段

class Distance 
{ 
public: 
    int ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) const; 
}; 

int Distance::ConvertToInches(const int cMiles, const int cYards, const int cFeet, const int cInches) const { /* ... */ } 

另外一个小问题:D2并不像D1 const引用。

+0

谢谢,这是完美的! – 2014-10-05 03:02:03

相关问题