2011-11-25 70 views
2

我想让我的函数返回一个对象数组。但我想对返回的引用进行一些限制,以便返回的值/引用不会被调用者修改。从函数返回const引用

class A 
{ 
    B **arrB; 

    public : 
     A() 
     { 
      initialize arrB 
     } 
     B** getB() 
     { 
      return arrB; 
     } 
} 

In above code, array returned by getB() function, should not be modified. Can someone suggest best way to do this ? Can "const" help?

+4

任何你不只是返回'vector'的理由? –

+1

'const'可以提供帮助,但是如果用户将指针转换为非const指针,那么他可以修改矢量......但是从我所知道的'const'是唯一的方法 – INS

+0

除非您有特定原因使用标准容器。也许你需要一个矢量矢量,也许你需要一个平面矢量。 – curiousguy

回答

3

Yes it will help. But then you will get an error about illegal conversion from B **const B **,但这是const_cast的原因:

const B** getB() const 
{ 
    return const_cast<const B**>(arrB); 
} 

注意,我在函数声明之后增加了额外的const预选赛。这告诉编译器该函数不会修改类中的任何内容。

+0

谢谢..这似乎是我在找什么。会试试这个。 – Rahul

4

这应该这样做:

const B * const * getB() const { return arrB; } 

编辑:添加常量,因为成员函数不修改内容。

1

const并没有真正的帮助。当您尝试修改阵列时,编译器可能会引发一些警告/错误,但您始终可以投射到非const指针并对其进行修改。 const更多的是给这个类的用户一个提示:我给你的指针是只读的;修改它在你的危险!

1

那么,我所看到的可能的方式是从私有文件(包含原始对象实例的副本)中复制新的数组。如果你想确保该类的私有成员没有被改变,那么你就不需要关心使用arrB指针副本的代码将如何处理它。但是,当然有更多的内存使用和消费者必须删除获得的数组的缺点。