为引用返回访问器定义获取和设置行为
Defining Get and Set Behavior for Reference Returning Accessor
作为几个较大项目的一部分,我正在开发一个矩阵模板类,该类仅在块中元素的值从定义的初始值设定项值更改时才动态分配块。这个类将用于一些相当复杂的数学,所以我试图保持界面尽可能简单直观。我希望能够使用运算符(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中使用的方法。缺点是访问内部数据的成员有点不方便,但如果这是一种不常见的情况,这将是一个很好的权衡。
- 如何获取进程以设置其亲和力?
- 如何获取控制面板设置值,如字体大小
- 获取和设置函数 c++
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 在 C++ 中将函数获取和设置为虚拟函数
- Qt 原子 int 获取并立即设置
- 提升获取文本的区域设置"Conversion failed"
- 如何使用C++获取/设置OBS中的垂直滚动过滤器属性?
- 在通过 P/Invoke 获取的 C++ 结构上设置 C# 回调
- 如何在Windows中获取和设置系统音量
- 如何设置获取类的私有成员:寻找更好的方法
- 在 c++ 中为我的类设置/获取方法时遇到问题
- 通过 C/C++ 使用 JPEG 像素格式在 v4l2 中设置/获取相机 JPEG 压缩质量
- C++字符串和设置/获取函数
- 如何制作一个好的设置/获取方法
- 设置获取指针
- 在c++中通过指针设置/获取值
- 设置/获取 Java 列表<>从 C 代码
- 在窗口模式下设置/获取我的绝对鼠标位置
- 使用复共轭来设置/获取数组值的代理