如何定位C++抽象类中未重写的纯虚函数?(Godot开发场景)
解决Godot中MultiplayerPeer子类仍标记为抽象类的问题
你的NullaryMultiplayerPeer类仍被标记为抽象类,是因为遗漏了MultiplayerPeer中的几个纯虚函数,必须全部实现才能实例化。以下是遗漏的函数及完整修改方案:
遗漏的纯虚函数
MultiplayerPeer中要求必须实现的纯虚函数你漏掉了以下几个:
get_available_packet_count():返回当前可用的数据包数量get_packet():读取一个数据包的内容put_packet():发送一个数据包set_allow_remote_simulation():设置是否允许远程模拟is_allowing_remote_simulation():查询是否允许远程模拟
修改后的头文件
#ifndef NULLARY_MULTIPLAYER_PEER #define NULLARY_MULTIPLAYER_PEER #include <godot_cpp/classes/multiplayer_peer.hpp> #include <godot_cpp/classes/crypto.hpp> namespace godot { class NullaryMultiplayerPeer : public MultiplayerPeer { GDCLASS(NullaryMultiplayerPeer, MultiplayerPeer); private: protected: static void _bind_methods(); public: NullaryMultiplayerPeer(); ~NullaryMultiplayerPeer(); // 已实现的函数 void set_transfer_channel(int p_channel); int get_transfer_channel() const; void set_transfer_mode(TransferMode p_mode); TransferMode get_transfer_mode() const; void set_refuse_new_connections(bool p_enable); bool is_refusing_new_connections() const; bool is_server_relay_supported() const; void set_target_peer(int p_peer_id); int get_packet_peer() const; TransferMode get_packet_mode() const; int get_packet_channel() const; void disconnect_peer(int p_peer, bool p_force = false); bool is_server() const; void poll(); void close(); int get_unique_id() const; ConnectionStatus get_connection_status() const; // 新增必须实现的纯虚函数 int get_available_packet_count() const; Error get_packet(const uint8_t **r_buffer, int &r_buffer_size); Error put_packet(const uint8_t *p_buffer, int p_buffer_size); void set_allow_remote_simulation(bool p_enable); bool is_allowing_remote_simulation() const; }; } #endif
修改后的cpp文件
#include "nullary_multiplayer_peer.h" #include <godot_cpp/core/class_db.hpp> #include <godot_cpp/core/error_macros.hpp> using namespace godot; void NullaryMultiplayerPeer::_bind_methods() { } NullaryMultiplayerPeer::NullaryMultiplayerPeer() { } NullaryMultiplayerPeer::~NullaryMultiplayerPeer() { } // 已实现的函数 void NullaryMultiplayerPeer::set_transfer_channel(int p_channel) {} int NullaryMultiplayerPeer::get_transfer_channel() const { return 0; } void NullaryMultiplayerPeer::set_transfer_mode(TransferMode p_mode) {} MultiplayerPeer::TransferMode NullaryMultiplayerPeer::get_transfer_mode() const { return MultiplayerPeer::TransferMode::TRANSFER_MODE_UNRELIABLE; } void NullaryMultiplayerPeer::set_refuse_new_connections(bool p_enable) {} bool NullaryMultiplayerPeer::is_refusing_new_connections() const { return true; } bool NullaryMultiplayerPeer::is_server_relay_supported() const { return false; } void NullaryMultiplayerPeer::set_target_peer(int p_peer_id) { } int NullaryMultiplayerPeer::get_packet_peer() const { return 0; } MultiplayerPeer::TransferMode NullaryMultiplayerPeer::get_packet_mode() const { return MultiplayerPeer::TransferMode::TRANSFER_MODE_UNRELIABLE; } int NullaryMultiplayerPeer::get_packet_channel() const { return 0; } void NullaryMultiplayerPeer::disconnect_peer(int p_peer, bool p_force) { } bool NullaryMultiplayerPeer::is_server() const { return false; } void NullaryMultiplayerPeer::poll() {} void NullaryMultiplayerPeer::close() {} int NullaryMultiplayerPeer::get_unique_id() const { return 0; } MultiplayerPeer::ConnectionStatus NullaryMultiplayerPeer::get_connection_status() const { return MultiplayerPeer::ConnectionStatus::CONNECTION_DISCONNECTED; } // 新增函数的实现 int NullaryMultiplayerPeer::get_available_packet_count() const { // 空实现,返回0表示无可用数据包 return 0; } Error NullaryMultiplayerPeer::get_packet(const uint8_t **r_buffer, int &r_buffer_size) { // 空实现,返回错误表示无数据包可读取 *r_buffer = nullptr; r_buffer_size = 0; return ERR_UNAVAILABLE; } Error NullaryMultiplayerPeer::put_packet(const uint8_t *p_buffer, int p_buffer_size) { // 空实现,返回OK表示"发送成功"(实际无操作) return OK; } void NullaryMultiplayerPeer::set_allow_remote_simulation(bool p_enable) { // 空实现 } bool NullaryMultiplayerPeer::is_allowing_remote_simulation() const { // 默认返回false return false; }
说明
因为你的子类没有实现所有纯虚函数,C++编译器会将其视为抽象类,禁止实例化。添加上述函数后,类就会成为可实例化的具体类。
如果需要验证编译时的抽象类错误,可以在SCons构建时添加-Wall或-Werror编译选项,这样编译器会明确指出哪些纯虚函数未实现。
内容的提问来源于stack exchange,提问作者Michael Macha
相关产品推荐
相关产品推荐

