【问题标题】:C++ Dynamic Array only getter works with overloaded [] operatorsC++ 动态数组仅 getter 可与重载的 [] 运算符一起使用
【发布时间】:2016-03-16 11:18:00
【问题描述】:

我的 C++ 数组中有一个重载的 [ ] 运算符。我有两个:

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

但是,我注意到如果我这样做:

std::cout << dynamicArray[4]; 

它只使用了setter,基本上只是忽略了getter。有没有办法让它使用吸气剂?问题是,我的 Getter 具有确保每次分配值时都会更改名为“size”的变量的代码。但是当我只获得价值而不改变它时,我不希望它真正触发。

getter 的代码是:

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

return buffer_[position];

当时我已经尝试了很多东西,比如将 & 插入 getter,但这也不起作用。如果这很重要,getter 也高于代码中的 setter。

另外,在构造容量为 5 的动态数组时,让所有元素保持原样(基本上是随机值)是一种好习惯,还是应该执行一个循环将它们全部设置为空/零?

【问题讨论】:

    标签: c++ operator-overloading constants


    【解决方案1】:

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

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

    【讨论】:

    • 这是否意味着每次我想使用 getter 时我都必须创建一个 const 对象,因为 setter 无法使用它?
    • 你可以试试const_cast这个对象。
    【解决方案2】:

    问题在于表达式dynamicArray[4] 的计算不考虑其上下文:它不知道它是在赋值的左边还是用作值。由于dynamicArray 不是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
        // ...
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2017-10-12
      相关资源
      最近更新 更多