如果之前已经回答过这个问题我很抱歉,我无法在任何地方找到答案。
我在保持const正确性方面遇到了麻烦。
我有以下定义。
struct C {
int x,y;
};
class A {
public:
C c;
C& getC() { return c; }
};
class B {
public:
void forwardInfo(const A& a) const {
const C& c = a.getC(); // <= compiler complains here
daoObject.updateTableX(c.x,c.y);
}
};
编译器抱怨对象a是const,因此无法调用a.getC(),因为该方法不是const。
但是我将结果分配给const引用。 现在我只是将一个对象转换为非const引用,如下所示:
const C& c = ((A&)a).getC();
这有效,但并不优雅。没有改变常数,有没有更好的方法。我相信对于对象A,返回C不是const是合理的,因为它意味着要改变。
forwardInfo也应该是const,因为我不想改变任何东西。
我不确定为什么编译器不允许我这样做并且有更好的方法吗?
聚苯乙烯。我可以使用getter / setter方法,但是C类可以用作传递给数据库的数据桶。
谢谢。
修正:施法中的支架位置和不正确的施法。
答案 0 :(得分:11)
你可以超载&#34; getC&#34;像这样的方法:
C& getC() { return c; }
const C& getC() const { return c; }
答案 1 :(得分:0)
如果你正在调用const A&
的函数,那么你也需要将该函数声明为const
,因为编译器不知道A
的对象是否会改变因此无法验证参数const A& a
struct C {
int x,y;
};
class A {
public:
C c;
const C& getC() const { return c; }
};
class B {
public:
void forwardInfo(const A& a) const {
const C& c = a.getC();
daoObject.updateTableX(c.x,c.y);
}
};
请注意A类const C& getC() const { return c; }
通过使用const
,我们告诉编译器A::getC()
不会修改它被调用的对象,因此这将起作用。
此外,您需要将函数的返回类型更改为const
,就像您需要的那样。
注意:您可以为const
变量指定非const
值,但不能相反。 const
是一个添加的属性,它告诉编译器值(或引用地址,也是一个值),不会改变。
int foo1 = 5;
const int foo2 = 10;
int& bar1 = foo1; // allowed
const int& bar2 = foo1; // allowed
int& bar3 = foo2; // NOT allowed -> will give compile time error
const int& bar4 = foo2; // allowed