NS3-개체 프레임 통합

8025 단어
NS-3의 리셋은 사실 C 언어의 기본 함수 포인터의 봉인 클래스이다.
  • 함수 인삼
  • 류의 구성원 변수
  • 리셋 함수는 특정한 이벤트나 특정한 조건을 충족시킬 때(시간 초과)가 호출되어 이 이벤트나 조건에 응답하는 데 사용되며 확장 프로그래밍에 자주 사용되는 수단이다.리셋의 가장 큰 장점은 확장성이 강하다는 데 있다.구체적인 함수와 연결할 필요가 없고, 만들 때 그 함수를 호출할지 동적으로 결정할 수 있습니다.예를 들어 이 때 우리는 덧셈을 더 이상 호출하고 싶지 않고 곱셈을 호출하고 싶다면 A 대상의 실례에 곱셈 조작을 귀속시킬 수 있고 A류의 정의를 바꾸지 않아도 된다.
    NS3에서는 각종 프로토콜 호출이나 추적 시스템을 처리하기 위해 리셋 사상을 사용한다.

    NS3의 콜백(callback.cc)


    NS3에서 일반 함수, 대상의 방법, 클래스의 정적 방법 등에 대한 봉인(Callback 대상, 그 중에서 C++의 템플릿을 사용하여 대응하는 함수의 반환값과 파라미터를 표시한다. 그중 , 그 다음 템플릿 파라미터는 함수의 파라미터를 표시), src/core/module/callback.h에서 최대 9개의 매개 변수를 추가할 수 있는 리셋을 실현했다.
    NS3 
       |(FunctorCallbackImpl)
        BoundFunctorCallbackImpl
       |(MemPtrCallbackImpl)
       BoundMemPtrCallbackImpl
       
            MakeCallback()
            MakeBoundCallback()

    일반 함수에 대한 콜백(FunctorCallbackImpl)

  • 콜백 유형: Callback
  • MakeCallback () 함수로 리셋 대상을 만듭니다
  • Callback callback = MakeCallback(&add);
    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    
    #include "ns3/core-module.h"
    
    using namespace ns3;
    
    NS_LOG_COMPONENT_DEFINE ("TryCallback");
    
    class A {
    public:
        A(Callback calculator);
    
        void calculate();
    private:
        Callback m_calculator;
    };
    
    A::A (Callback calculator)
    {
        m_calculator = calculator;
    }
    
    void
    A::calculate ()
    {
        int result = m_calculator(5, 6);
        NS_LOG_UNCOND(result);
    }
    
    int add(int a, int b)
    {
        return a + b;
    }
    
    int
    main (int argc, char *argv[])
    {
        A one(MakeCallback(&add));
        one.calculate();
    }

    메서드의 콜백(MemPtrCallbackImpl)


    C++에서는 방법이 클래스나 대상에 봉인되어 있기 때문에 일반 함수와는 사용 방법이 다르다.따라서 NS-3 메소드 콜백에 대한 MemPtrCallbackImpl 유형이 특별히 만들어졌습니다.이 유형은 MakeCallback () 함수를 통해서도 직접 만들 수 있으며, 일반 함수 리셋과 달리, 만드는 방법의 리셋은 반드시 구체적인 대상에게 전달되어야 한다.
  • 콜백 정의:
  • Callback m_complexCalculator;
  • 콜백 객체 만들기:
  • Complex first(1, 3);
    Callback callback = MakeCallback(&Complex::add, &first);

    전체 프로그램
    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    
    #include 
    
    #include "ns3/core-module.h"
    
    using namespace ns3;
    
    NS_LOG_COMPONENT_DEFINE ("TryCallback");
    
    class Complex {
    public:
        Complex(int a, int b);
        Complex add(Complex & another);
        friend std::ostream & operator < calculator);
        A(Callback complexCalculator);
    
        void calculate();
        void complexCalculate(Complex b);
    private:
        Callback m_calculator;
        Callback m_complexCalculator;
    };
    
    A::A (Callback calculator)
    {
        m_calculator = calculator;
    }
    
    A::A (Callback complexCalculator)
    {
        m_complexCalculator = complexCalculator;
    }
    
    void
    A::complexCalculate (Complex b)
    {
        Complex result = m_complexCalculator(b);
        std::cout << result << std::endl;
    }
    
    void
    A::calculate ()
    {
        int result = m_calculator(5, 6);
        NS_LOG_UNCOND(result);
    }
    
    int add(int a, int b)
    {
        return a + b;
    }
    
    int multiply(int a, int b)
    {
        return a * b;
    }
    
    int
    main (int argc, char *argv[])
    {
        Complex first(1, 3);
        Complex second(2, 5);
    
        A one(MakeCallback(&Complex::add, &first));
        one.complexCalculate(second);//3+8i
    }

    바인딩된 매개변수의 콜백(MakeBoundCallback)


    NS-3은 콜백을 생성할 때 일부 매개변수를 콜백에 바인딩할 수 있는 바인딩 매개 변수를 제공합니다.바인딩된 매개 변수, 첫 번째 매개 변수부터 순서대로 바인딩할 수 있으며, 매개 변수를 건너뛸 수 없습니다.
    대상의 방법에 대해 대상 자체가 데이터를 저장하는 능력을 가지기 때문에 파라미터를 귀속시키는 리셋이라는 개념을 필요로 하지 않는다.따라서 NS-3에는 바인딩 매개 변수의 객체 메소드 콜백이 제공되지 않습니다.
    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    
    #include 
    
    #include "ns3/core-module.h"
    
    using namespace ns3;
    
    NS_LOG_COMPONENT_DEFINE ("TryCallback");
    
    class A {
    public:
        A(Callback calculator);
    
        void calculate();
    private:
        Callback m_calculator;
    };
    
    A::A (Callback calculator)
    {
        m_calculator = calculator;
    }
    
    void
    A::calculate ()
    {
        int result = m_calculator(6);
        NS_LOG_UNCOND(result);
    }
    
    int add(int a, int b)
    {
        return a + b;
    }
    
    int multiply(int a, int b)
    {
        return a * b;
    }
    
    int
    main (int argc, char *argv[])
    {
        A one(MakeBoundCallback(&add, 8));
        one.calculate();
    }

    콜백의 바인딩 여부를 판단합니다(Callback:: IsNull().


    리셋 귀속 함수를 직접 호출하지 않으면 프로그램에 이상이 발생합니다.
  • 프로그램의 건장성을 확보하기 위해 NS3에서 Callback:::IsNull () 을 제공하여 리셋이 귀속 함수인지 여부를 판단합니다.
  • 이미 귀속 함수를 리셋하였습니다. 다시 사용이 완료되면 귀속을 취소하려면 NS-3에서 제공하는MakeNullCallback() 방법을 사용하여 리셋을 비울 수 있습니다.
  • /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    
    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    
    #include 
    
    #include "ns3/core-module.h"
    
    using namespace ns3;
    
    NS_LOG_COMPONENT_DEFINE ("TryCallback");
    
    class A {
    public:
        A();
        A(Callback calculator);
    
        void calculate();
    
        void
        setCalculator (const Callback& calculator)
        {
            m_calculator = calculator;
        }
    
    private:
        Callback m_calculator;
    };
    
    A::A(){}
    
    A::A (Callback calculator)
    {
        m_calculator = calculator;
    }
    
    void
    A::calculate ()
    {
        if(m_calculator.IsNull()) {
            NS_LOG_UNCOND("callback is not bind to any function.");
        } else {
            int result = m_calculator(6, 8);
            NS_LOG_UNCOND(result);
        }
    }
    
    int add(int a, int b)
    {
        return a + b;
    }
    
    int multiply(int a, int b)
    {
        return a * b;
    }
    
    int
    main (int argc, char *argv[])
    {
        A one(MakeCallback(&add));
        one.calculate();
        one.setCalculator(MakeNullCallback()); // 
        one.calculate();
    }

    속성으로 콜백(CallbackValue)


    NS-3은 콜백에 대한 속성 값 유형인 CallbackValue를 구성하고 액세스 및 검사기를 구현합니다.
    프로그램 데모:
    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    
    #include 
    
    #include "ns3/core-module.h"
    
    using namespace ns3;
    
    NS_LOG_COMPONENT_DEFINE ("TryCallback");
    
    namespace ns3 {
    
      class A : public Object{
      public:
        static TypeId GetTypeId (void);
    
        A();
    
        void calculate();
    
        void
        setCalculator (const Callback& calculator)
        {
          m_calculator = calculator;
        }
    
      private:
        Callback m_calculator;
      };
    
      A::A(){}
    
        TypeId
        A::GetTypeId (void)
        {
        static TypeId tid = TypeId ("ns3::A")
          .AddConstructor()
    .SetParent ()
    .AddAttribute ("calculator", "help text",
    CallbackValue (),
    MakeCallbackAccessor (&A::m_calculator),
    MakeCallbackChecker ())
    ;
    return tid;
    }
    void
    A::calculate ()
    {
    if(m_calculator.IsNull()) {
    NS_LOG_UNCOND("callback is bind to any function.");
    } else {
    int result = m_calculator(6, 8);
    NS_LOG_UNCOND(result);
    }
    }
    int add(int a, int b)
    {
    return a + b;
    }
    int multiply(int a, int b)
    {
    return a * b;
    }
    }
    int
    main (int argc, char *argv[])
    {
    Ptr a = CreateObject();//스마트 포인터를 사용하여 클래스 A 인스턴스 만들기
    a->SetAttribute("calculator", CallbackValue(MakeCallback(&add)));//속성calculator에 리셋 함수add 지정하기
    a->calculate();
    }

    예에서 이전 A의 참조 함수를 삭제합니다. 이 때 A에 리셋을 지정한 작업은 속성 프레임워크에서 완성됩니다.따라서 A는 Object 클래스를 상속하고 GetTypeId () 방법을 실현하여 속성 프레임워크를 사용해야 한다.GetTypeId() 메서드에서 구성원 변수 m 에 바인딩된 "calculator"속성을 만듭니다.calculator에서 속성 값 유형은 CallbackValue입니다.이 속성의 기본 리셋 값은 비어 있으며 변수 액세서리와 기본 검사기를 사용합니다.

    좋은 웹페이지 즐겨찾기