gpt4 book ai didi

c++ - SFML 网络 |通过 sf::Packets 发送包含其他对象的对象会导致空数据

转载 作者:行者123 更新时间:2023-11-30 05:12:33 24 4
gpt4 key购买 nike

我正在尝试向客户端发送 map 数据,该客户端采用包含 map 图 block 坐标的多个 vector 的形式。整个 map 结构可以简化为这样的东西(不是实际代码,但我也使用它重现了问题):

struct Tile {
sf::Vector3<int> coords;
};

struct Map {
Tile tiles[4];
};

然后,我使用这些运算符将此类对象添加到 sf::Packet :

sf::Packet& operator<<(sf::Packet& packet, sf::Vector3<int> vec) {
return packet << vec.x << vec.y << vec.z;
}

sf::Packet& operator>>(sf::Packet& packet, sf::Vector3<int> vec) {
return packet >> vec.x >> vec.y >> vec.z;
}

sf::Packet& operator<<(sf::Packet& packet, Tile test) {
return packet << test.coords;
}

sf::Packet& operator>>(sf::Packet& packet, Tile test) {
return packet >> test.coords;
}

sf::Packet& operator<<(sf::Packet& packet, Map test) {
for(int i = 0; i < 4; i++) {
packet << test.tiles[i];
}
return packet;
}

sf::Packet& operator>>(sf::Packet& packet, Map test) {
for(int i = 0; i < 4; i++) {
packet >> test.tiles[i];
}
return packet;
}

到这里,应该没有任何问题: map 必须反序列化为 4​​ 个图 block ,必须反序列化为 sf::Vector3<int>。本身。

然后是发送:

Tile test;
test.coords.x = 42;
test.coords.y = 34;
test.coords.z = 43;

Map test3;
test3.tiles[0] = test;

sf::Packet packet;
packet << test3;

sock.send(packet);

这段代码运行良好(我用GDB检查了packet的内容,数据确实是一样的)。接收代码在服务器端也能正常工作:

sf::Packet packet;
sock.receive(packet);
Map test;
cout << "packet received" << endl;

检查数据包的内容(仍然使用 GDB)给出了与发送时相同的内容。 test的内容是随机的(这是正常的,因为它还没有被初始化)。

真正的问题发生在将实际数据包数据反序列化为 test 时变量:

if(packet >> test) {
cout << test.tiles[0].coords.x;
} else {
cout << "fail" << endl;
}

打印的结果是0,反序列化很好(控制台没有出现“fail”),但是数据不正确。巡检test GDB 的内容显示其数组中的每个元素都是 0。这是 GDB 的输出:

(gdb) print test
$1 = {tiles = {{coords = {x = 0, y = 0, z = 0}}, {coords = {x = 0, y = 0, z = 0}}, {coords = {x = 0, y = 0, z = 0}}, {coords = {
x = 0, y = 0, z = 0}}}}

这可能是什么原因?我很确定我在这里做错了什么,但我真的不明白为什么。

在此先感谢您的帮助:)

最佳答案

好吧,我终于明白为什么这行不通了。答案当然是极其愚蠢的,而且是愚蠢的 C++ 初学者的典型回答:D。

在不通过引用传递对象的情况下使用运算符函数没有任何机会起作用(因为变量的内容将保留在运算符函数中并且不会被更改)。

所以,改变这个:

sf::Packet& operator>>(sf::Packet& packet, Map test) {
for(int i = 0; i < 4; i++) {
packet >> test.tiles[i];
}
return packet;
}

为此:

sf::Packet& operator>>(sf::Packet& packet, Map& test) {
for(int i = 0; i < 4; i++) {
packet >> test.tiles[i];
}
return packet;
}

工作得更好:)

关于c++ - SFML 网络 |通过 sf::Packets 发送包含其他对象的对象会导致空数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44474287/

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