c++ 我可以检查一下变量是否会被赋值吗?

ejk8hzay  于 2023-03-14  发布在  其他
关注(0)|答案(2)|浏览(245)

我有一个嵌套链表矩阵。我想使用运算符重载,这样我就可以执行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`.
e4eetjau

e4eetjau1#

你不能。
您应该做的是将operator()(或者您用来通过索引访问元素的任何东西)标记为[[nodiscard]],这样,任何试图不使用该值调用它的人都会收到编译器警告。
这不允许您区分读和写,因此阅读一个不存在的元素将创建该元素。
如果您不希望这样,则需要两个独立的函数来阅读和写入元素,类似于.set(x, y, value).get(x, y)
有些人可能会建议从operator()返回一个helper类,重载operator=(写元素)和operator T(阅读元素),但这是不好的,因为operator T并不总是自动调用的(例如,当把对象传递给函数模板时),当它不这样做时,你的用户会感到困惑。

i86rm4rw

i86rm4rw2#

下面是中间对象技术的概要

class Matrix
{
    friend class MRef;
    MRef operator()(int i, int j) { return MRef(*this, i, j); }
};

class MRef
{
public:
    MRef(Matrix& m, int i, int j) : m(m), i(i), j(j) {}
    MRef& operator=(int n) const { code to set value in the matrix }
    MRef& operator=(const MRef& m) const { return operator=((int)m); }
    operator int() const { code to get value from the matrix }
private:
    Matrix& m;
    int i;
    int j;
};

Matrix m;
m(1,2) = 3;
int x = m(3, 4);
m(5, 6) = m(7, 8);

我完全同意HolyBlackCat,这段代码有问题,但任何解决方案都是一种妥协。你可以选择你想要的妥协。这种技术有方便的语法,但我个人不确定这有多重要。我会选择单独的getter和setter。

相关问题