0

omn​​et ++に含まれるクラスから関数をオーバーライドする方法は?
C++ で行っているように関数をオーバーライドしようとすると、再定義エラーが発生します。

「handleMessage(cMessage *msg)」の再定義

これは現在のコードです:

#include "MalAODVRouter.h"
#include "AODVRouting.cc"
#include "AODVRouting.h"

Define_Module(MalAODVRouter);

void AODVRouting::handleMessage(cMessage *msg) // Error here
{
    //-----------------------------------------------------Added to Simulate COPS

        std::string currentMsg=msg->getName();

            if(BF->CheckBloom(currentMsg)==1)
                bubble("Replayed!!");
            else
                {
                    BF->AddToBloom(currentMsg);
                    bubble("Legit Packet");
                    std::cout<<"Legitimate. Packet is added to the Bloom Filter.\n";
                }
     //-----------------------------------------------------------------------------

    if (!isOperational) {
        if (msg->isSelfMessage())
            throw cRuntimeError("Model error: self msg '%s' received when isOperational "
                "is false", msg->getName());

        EV_ERROR << "Application is turned off, dropping '" << msg->getName()
            << "' message\n";
        delete msg;
    }

    if (msg->isSelfMessage()) {
        if (dynamic_cast<WaitForRREP *>(msg))
            handleWaitForRREP((WaitForRREP *)msg);
        else if (msg == helloMsgTimer)
            sendHelloMessagesIfNeeded();
        else if (msg == expungeTimer)
            expungeRoutes();
        else if (msg == counterTimer) {
            rreqCount = rerrCount = 0;
            scheduleAt(simTime() + 1, counterTimer);
        }
        else if (msg == rrepAckTimer)
            handleRREPACKTimer();
        else if (msg == blacklistTimer)
            handleBlackListTimer();
        else
            throw cRuntimeError("Unknown self message");
    }
    else {
        UDPPacket *udpPacket = dynamic_cast<UDPPacket *>(msg);
        AODVControlPacket *ctrlPacket = check_and_cast<AODVControlPacket *>
            (udpPacket->decapsulate());
        IPv4ControlInfo *udpProtocolCtrlInfo = dynamic_cast<IPv4ControlInfo *>
            (udpPacket->getControlInfo());
        ASSERT(udpProtocolCtrlInfo != NULL);
        IPv4Address sourceAddr = udpProtocolCtrlInfo->getSrcAddr();
        unsigned int arrivalPacketTTL = udpProtocolCtrlInfo->getTimeToLive();

        switch (ctrlPacket->getPacketType()) {
            case RREQ:
                handleRREQ(check_and_cast<AODVRREQ *>(ctrlPacket), sourceAddr,
                    arrivalPacketTTL);
                break;
            case RREP:
                handleRREP(check_and_cast<AODVRREP *>(ctrlPacket), sourceAddr);
                break;
            case RERR:
                handleRERR(check_and_cast<AODVRERR *>(ctrlPacket), sourceAddr);
                break;
            case RREPACK:
                handleRREPACK(check_and_cast<AODVRREPACK *>(ctrlPacket), sourceAddr);
                break;
            default:
                throw cRuntimeError("AODV Control Packet arrived with undefined packet "
                    "type: %d", ctrlPacket->getPacketType());
        }
        delete udpPacket;
    }
}
4

1 に答える 1

0

関数には 2 つのバージョンがありAODVRouting::handleMessage(cMessage *msg)ます。1 つはAODVRouting.ccから来て#include "AODVRouting.cc"おり、もう 1 つはコードを貼り付けた現在のファイルにありますが、名前はわかりません。

現在のファイルから行を削除するか#include "AODVRouting.cc"、クラス名と重複しないようにクラスの名前を変更してくださいAODVRouting

于 2015-05-18T15:32:12.727 に答える