我有一个嵌套链表矩阵。我想使用运算符重载,这样我就可以执行matrix(x,y)
来访问“节点”。问题是,我如何检查int&
是否将被赋值?这样做的原因是因为我不想创建一个“节点”,除非它被赋值。
结构:
类Matrix
-〉初始化时(例如matrix matrix(10,10)
,其中10x10
是维度)嵌套链表不会在内存中创建节点,它们会等待直到节点被修改,因此如果没有'node',则空格值为0。int &operator() (row index, column index)
-〉当这个被触发时(matrix(x,y)
),那么它基本上搜索链表行(如果没有找到,那么它用那个索引创建一个),然后它搜索链表列(如果没有找到,那么它用那个索引创建一个),在所有这些完成之后,它通过引用返回数据变量。
所以基本上,如果我知道“节点”将被赋值/初始化,我只想做顶部。
示例(注:“节点”尚不存在)
矩阵(4,5)= 18;//返回int&,使其可以赋值为18矩阵(4,5);//不创建“node”,因为不会为它赋值
Note: this is just background info, please don't code everything and give me the answer. All I want to know is if there is a way that before `operator()` is called it checks for assignment so I know it will be assigned a value and won't just return for no reason.
Please don't tell me to do `operator(row indx, column indx, data)`, if possible I would like to keep the format of `matrix(row,column) = x`.
2条答案
按热度按时间e4eetjau1#
你不能。
您应该做的是将
operator()
(或者您用来通过索引访问元素的任何东西)标记为[[nodiscard]]
,这样,任何试图不使用该值调用它的人都会收到编译器警告。这不允许您区分读和写,因此阅读一个不存在的元素将创建该元素。
如果您不希望这样,则需要两个独立的函数来阅读和写入元素,类似于
.set(x, y, value)
和.get(x, y)
。有些人可能会建议从
operator()
返回一个helper类,重载operator=
(写元素)和operator T
(阅读元素),但这是不好的,因为operator T
并不总是自动调用的(例如,当把对象传递给函数模板时),当它不这样做时,你的用户会感到困惑。i86rm4rw2#
下面是中间对象技术的概要
我完全同意HolyBlackCat,这段代码有问题,但任何解决方案都是一种妥协。你可以选择你想要的妥协。这种技术有方便的语法,但我个人不确定这有多重要。我会选择单独的getter和setter。