You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:00:03