2009-12-20 76 views
1

我得想重载()运算符用于数组访问时,另一个问题:C++()操作问题

const OctTreeNode*& operator()(const int i, const int j, const int k) const{ 
    return m_cells[k*m_resSqr+j*m_res+i]; 
} 

OctTreeNode*& operator()(const int i, const int j, const int k){ 
    return m_cells[k*m_resSqr+j*m_res+i];  
} 

vector<OctTreeNode*> m_cells; 

我得到一个

C2440 'return': cannot convert from 'OctTreeNode *const' to 'const OctTreeNode *&' 

这是怎么回事?我正在像另一个班级那样宣布它。唯一的区别是,其他类是通用的,还有我使用牛逼&,而不是OctreeNode * &

+1

是否有返回对指针的引用而不是引用元素的原因? – pmr 2009-12-20 18:01:25

+0

...或指向成员的指针?返回const引用的想法是它可能比返回完整副本要便宜得多,但如果类型是整数或指针,它没有多大意义。 (假设你不能将引用返回到真实对象,这将是一个更好的方法) – 2009-12-21 07:59:06

回答

2

的第一家运营商应该返回常量

const OctTreeNode * const & operator()(const int i, const int j, const int k) const{ 
     return m_cells[k*m_resSqr+j*m_res+i]; 
} 

...或者常量的*前,我从来没有记得-_-

第一个const告诉我们,我们不能修改OctTreeNode,第二个告诉我们,我们不能修改指向它的指针(例如设置为NULL),而第三个一个告诉我们该方法不会改变对象。

说实话,我不确定第一个是需要的,因为我们需要授予const方法正确性的唯一方法是授予没有人会更改对这些指针的引用。

+0

thx。但你能解释我为什么吗?为什么然后http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.12中的第一个运算符返回Fred&而不是Fred? – genesys 2009-12-20 17:54:14

+0

在一个表达式中的三个常量让我对这些常量实际上意味着什么感到困惑 – genesys 2009-12-20 17:55:36

+0

扩展我的答案 – 2009-12-20 17:59:29

0

通过常量值传递没有什么意义,正如你对i,j,k所做的那样。

+0

尝试在评论中说出这些内容,因为这不是真正问题的答案。 – pmr 2009-12-20 18:00:03

+0

对不起,还没有真正掌握这个地方:) – James 2009-12-20 18:02:22

+0

我有时将我的值参数作为const传递。这有助于我两个原因 - 如果我错误地尝试和改变它,编译器会通知我,其次,语义更清晰。唯一的缺点是功能在视觉上更大,认知上可能需要更长时间才能理解。 – 2009-12-20 18:17:33

0

常量运算符不正确,您正在返回对常量OctTreeNode的指针的非常量引用。

也就是说,如果声明一个指针

const int *a; 

a不是恒定的,什么a是恒定的。所以当你声明返回类型为

const OctTreeNode*& 

OctTreeNode是常量,但指针不是。这是一个错误,因为你的成员函数是const的,所以std :: vector是const,所以它返回的指针也是常量 - 最后你试图返回一个const指针作为非const指针。

要纠正这只是删除参考

const OctTreeNode* operator() 

,因为没有太多的点返回引用一个常量指针,你不能修改指针和引用将(可能)有大小相同无论如何指针。

+0

“没有太多的指针返回对常量指针的引用”接口的一致性?如果他在一种情况下返回一个指针,而在另一种情况下返回一个指向指针的指针,那么一个版本返回一个左值,另一个返回一个右值,这会影响您是否可以执行'&this-> operator()(1,2,3)',并将结果指针与另一个类似指针进行比较。这对于提问者来说是有用的,但它是两者之间的区别 – 2009-12-20 18:50:30

+0

这是真的,但是我的头顶我无法想到任何有用的东西 - 如果你需要接受它的地址,可能会想要改变它。 – 2009-12-20 19:18:47

+0

那么,你可能出于某种原因想要测试两个对operator()的调用是否访问过相同的元素(而不是只访问包含相同值的元素)。在这种情况下,当且仅当a == x && b == y&c == z时,'&foo(a,b,c)'=='&foo(x,y,z)所以还有另外一种方法可以做到这一点,如果你传递所有三个坐标,而不是仅仅一个参考。 – 2009-12-20 21:28:18

1

Kornel是正确的。澄清const应该在*之前还是之后,之后。 const OctTreeNode * const &OctTreeNode const * const &这两种类型是相同的,从右至左阅读时都很容易理解。

const OctTreeNode * const &是一个常量指向OctTreeNode的常量的引用。

OctTreeNode const * const &是对常量OctTreeNode的const指针的引用。

请注意,这些类型与无效类型const OctTreeNode const * &不同。这将是一个指向const的常量OctTreeNode的指针。

注意句子的最后部分常量OctTreeNode是const。其中一个常量是多余的,如果它是合法的,这种类型将相当于const const OctTreeNode * &