NS3-개체 프레임 통합
NS3에서는 각종 프로토콜 호출이나 추적 시스템을 처리하기 위해 리셋 사상을 사용한다.
NS3의 콜백(callback.cc)
NS3에서 일반 함수, 대상의 방법, 클래스의 정적 방법 등에 대한 봉인(Callback 대상, 그 중에서 C++의 템플릿을 사용하여 대응하는 함수의 반환값과 파라미터를 표시한다. 그중
, 그 다음 템플릿 파라미터는 함수의 파라미터를 표시), src/core/module/callback.h에서 최대 9개의 매개 변수를 추가할 수 있는 리셋을 실현했다.NS3
|(FunctorCallbackImpl)
BoundFunctorCallbackImpl
|(MemPtrCallbackImpl)
BoundMemPtrCallbackImpl
MakeCallback()
MakeBoundCallback()
일반 함수에 대한 콜백(FunctorCallbackImpl)
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().
리셋 귀속 함수를 직접 호출하지 않으면 프로그램에 이상이 발생합니다.
/* -*- 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입니다.이 속성의 기본 리셋 값은 비어 있으며 변수 액세서리와 기본 검사기를 사용합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.