赋值

时间:2015-07-06 06:05:13

标签: c++ reference const const-correctness

如果之前已经回答过这个问题我很抱歉,我无法在任何地方找到答案。

我在保持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类可以用作传递给数据库的数据桶。

谢谢。

修正:施法中的支架位置和不正确的施法。

2 个答案:

答案 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