2015-12-10 11 views
3

我的C++数组中有一个重载的[]运算符。我对他们有二:C++动态数组只有getter与超载的[]运算符一起工作

ElType operator[](int position) const; //getter 
ElType & operator[](int position); //setter 

然而,我发现,如果我的例子做:

std::cout << dynamicArray[4]; 

它只使用了二传手,基本上只是忽略了吸气。有没有办法让它使用getter?问题是,我的Getter有代码来确保每次分配一个值时,名为“size”的变量都会改变。但我不希望这会在我只获取价值而不改变它时触发。

需要getter的代码是:

ElType DynArray::operator[](int position) const{ 
std::cout << "using getter" << std::endl; 

return buffer_[position]; 

我已经尝试了很多事情,在这一点上,像坚持一个&进入吸气,但也不能工作。如果这个问题很重要的话,代码中的getter也在setter上方。另外,当构造容量为5的动态数组时,将所有元素保持原样(基本上是随机值)还是应该循环将它们全部设置为null /零是一个好习惯?

回答

0

由于您的getter是const成员函数,你应该能够通过使用const对象强制使用您的吸气剂:

const DynArray cArray = dynamicArray; 
std::cout << cArray[4]; 
+0

不意味着我必须做一个const对象每次我想要使用getter,因为setter不会使用它? –

+0

你可以试试[''''const_cast'''](http://en.cppreference.com/w/cpp/language/const_cast)该对象。 – mepcotterell

0

麻烦的是,表达dynamicArray[4]计算,而不考虑它的上下文:它不知道它是在作业的左边还是用作值。由于dynamicArray不是const,所以调用非const(Setter)方法。

如果你真的需要检测的差异,您可以使用代理对象(它有自己的一些缺点):

class DynArray { 
public: 
    class ElemProxy { 
    private: 
     ElemProxy(DynArray& arr, int pos) : m_arr(arr), m_pos(pos) {} 
     DynArray& m_arr; 
     int m_pos; 
     friend class DynArray; 
    public: 
     operator ElType() const { return static_cast<const DynArray&>(m_arr)[m_pos]; } 
     ElemProxy& operator=(ElType val); // Do Setter logic. 
    }; 

    ElemProxy operator[](int pos) { return ElemProxy(*this, pos); } 
    ElType operator[](int pos) const; // Getter 
    // ... 
};