我开始只是作为一个实验来讨论这个话题。假设你有两个班级。 "接收器" class必须复制存储在由" sender"维护的位置的内存块。类维护自己的内存块。例如,发送方类可以对OpenGL渲染引擎进行建模,该引擎生成描绘特定图形场景的位图,然后将这些位图作为原始缓冲区数据传递给接收方类,该接收方类可以对在应用程序的用户界面中显示这些图像的GUI元素进行建模。 。
发件人类声明如下:
class Sender {
public:
Sender(size_t = 0);
~Sender();
bool isEmpty();
void generateRandomData();
void exposeBuffer(unsigned char*&);
void exposeBufferSize(size_t&);
private:
size_t buffer_size;
unsigned char* buffer;
};
虽然接收器类声明如下:
class Receiver {
public:
Receiver(size_t = 0);
Receiver(Sender&);
~Receiver();
bool isEmpty();
void receive(Sender&);
private:
size_t buffer_size;
unsigned char* buffer;
};
主要功能内部发生的通信逻辑:
int main() {
int status(EXIT_SUCCESS);
Sender my_sender(10);
my_sender.generateRandomData();
Receiver my_receiver(my_sender);
my_receiver.receive(my_sender);
return status;
}
用于通信的重要方法定义如下
接收是作为Receiver类的成员函数实现的:
void Receiver::receive(Sender& sender) {
size_t sender_buffer_size;
sender.exposeBufferSize(sender_buffer_size);
if (sender_buffer_size != buffer_size) {
std::cout << "ERROR : receive : Incompatible buffer sizes!" <<
std::endl;
return;
}
unsigned char* sender_buffer = nullptr;
sender.exposeBuffer(sender_buffer);
std::memcpy(buffer, sender_buffer, buffer_size);
}
在上面的代码中,我关注的最关键的一点是Sender的exposeBuffer成员函数的实现:
void Sender::exposeBuffer(unsigned char* &to) {
to = buffer;
}
我主要担心的是: