为引用返回访问器定义获取和设置行为

Defining Get and Set Behavior for Reference Returning Accessor

本文关键字:设置 获取 引用 返回 访问 定义      更新时间:2023-10-16

作为几个较大项目的一部分,我正在开发一个矩阵模板类,该类仅在块中元素的值从定义的初始值设定项值更改时才动态分配块。这个类将用于一些相当复杂的数学,所以我试图保持界面尽可能简单直观。我希望能够使用运算符(row,col)通过引用访问矩阵元素,而不是使用get(row,coll)和set(element)方法。

然而,这变得有问题,因为由于分配行为,set和get的操作需要不同,并且需要根据初始值设定项值测试正在设置的值。这不能只返回一个引用就完成,所以我创建了一个包含引用的帮助程序类,可以转换为正确的数据类型,并返回了它。这就是接口的结构:

template <class T>
class Container{
public:
    // Element class which contains a reference to a data element
    class Element{
    public:
        // Constructor -- Initialize the element reference
        Element(T & element) :  _element(element){}
        // Assignment operator -- SET
        Element & operator=(const T & that){
            _element = that;
            return *this;
        }
        // Element to element assignment -- GET that, SET this
        Element & operator=(const Element & that){
            this->_element = that._element;
            return *this;
        }
        // Implicit conversion operator -- GET
        operator T(){
            return _element;
        }
    private :
        T & _element; // Element reference
    };
    // Return an element class containing a reference to the element
    Element operator()(int index){
        return Element(_data[index]);;
    }
private:
    T _data[10];
};

它依赖于隐式转换来使用返回的Element类,就好像它是T类型的一样。我测试过它,它似乎可以很好地用于基类型上的基本赋值和算术运算,但对于增量和二进制移位等运算符,则不会进行隐式转换,并且该操作会导致编译器错误。我想我会发现很多进一步的问题,试图将它与T一起用作类结构、指针等。

这一点,再加上依赖内隐转换来实现课堂矫正功能似乎是一种非常糟糕的做法,让我觉得我需要想出另一种方法。有什么办法可以修正我目前的做法吗?我可能采取的其他方法?或者我应该放弃这一点,让运算符(row,col)始终使用get和set方法进行分配,只在必要时进行分配?

你能为自己做的魔法只有这么多。

我想首先指出闪电战++和推力作为一些很好的教学例子。在第一种情况下,这些"魔术引用"主要用于通过子数组访问数据区域。第二种情况用于安全地访问来自其他内存空间(如GPU中)的数据,自动处理数据下载/上传。

我建议集中注意常见用法;您的容器主要用于保存标量值吗?然后只需提供常见的算术运算,如++、+=等,即可转发到实际实现中。您将看到这是2中使用的方法。缺点是访问内部数据的成员有点不方便,但如果这是一种不常见的情况,这将是一个很好的权衡。