gpt4 book ai didi

c++ - 调用非静态函数的重载括号运算符

转载 作者:行者123 更新时间:2023-11-28 04:49:35 25 4
gpt4 key购买 nike

我有一个类可以读取/写入外部随机存取存储器。

.h文件:

class RAM {
private:
bool Read(char *Buffer, size_t BytesToRead, uint32_t StartAddress);
bool Write(char *Buffer, size_t BytesToWrite, uint32_t StartAddress);

class proxy {
private:
size_t _index;
public:
proxy(size_t i);
void operator=(char rhs);
operator char();
}

public:
proxy operator[](size_t i);
};

.cpp 文件:

RAM::proxy RAM::operator[](size_t i) {
return proxy(i);
}

proxy::proxy(size_t i) {
_index = i;
}

void proxy::operator=(char rhs) {
Write(&rhs, 1, _index); // error
}

RAM::proxy::operator char() {
char Buf[1];
Read(Buf, 1, _index); // error
return Buf[0];
}

Read 和 Write 是处理对 RAM 的低级访问的函数。没有其他方法可以读取或写入 RAM。我尝试使用 proxy class in rvalue - how to implement assignment operator?但无法正确调整它:

error: cannot call member function 'bool RAM::Write(char*, size_t, uint32_t)' without object Write(&rhs, 1, _index)

error: cannot call member function 'bool RAM::Read(char*, size_t, uint32_t)' without object Read(Buf, 1, _index)

还有其他调用 Read 和 Write 的东西,所以我可能无法将它们设为静态。我还认为它们在创建 RAM 对象时已经实例化了。

最佳答案

多亏了 PeteBecker,我才能够想出一个工作代码。另外,我没有在最初的问题中提出问题,但我忽略了测试直接分配,结果证明这是一个不同的野兽。

class RAM {
private:
// changed 1st arg to void*, because type doesn't really matter.
bool Read(void *Buffer, size_t BytesToRead, uint32_t StartAddress);
bool Write(void *Buffer, size_t BytesToWrite, uint32_t StartAddress);

class proxy {
private:
size_t _index;
RAM *_parentPtr; // <-- added

public:
proxy(size_t i, RAM *ptr) {
_index = i;
_parentPtr = ptr; // <-- added
}
void operator=(char rhs) {
Write(&rhs, 1, _index); // works now
}
void operator=(proxy rhs) { // new function for direct assignment
char temp = rhs;
Write(&temp, 1, _index);
}
operator char() const {
char Buf[1];
Read(Buf, 1, _index); // works now
return Buf[0];
}
}

public:
proxy operator[](size_t i) {
return proxy(i, this);
}
};

我花了很长时间才弄清楚,我必须通过临时变量请求 rhs 的值才能执行 operator char() const。作为引用传递是行不通的。

关于c++ - 调用非静态函数的重载括号运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48510862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com