ここに質問の内容を詳しく書いてください。
輻輳制御アルゴリズムのシミュレーターを作成し、cwndの推移を確認するプログラムです。
ちなみにcwndの初期値は1、ssThreshの初期値は250です。
アルゴリズムの動作をクラスを用いて派生しました。
今回わからない点は、simulate関数の引数のalgorithmです。
クラスを引数とする場合にはどのようにプログラムを構築すればよいですか。
エラーメッセージ
fukusou.cpp: In function ‘void simulate(std::__cxx11::string*, const Base&)’:
fukusou.cpp:53:25: error: passing ‘const Base’ as ‘this’ argument discards qualifiers [-fpermissive]
algorithm.Timeout();
^
fukusou.cpp:11:8: note: in call to ‘void Base::Timeout()’
void Timeout(){
^~~~~~~
fukusou.cpp:59:31: error: passing ‘const Base’ as ‘this’ argument discards qualifiers [-fpermissive]
algorithm.increase_cwnd();
^
fukusou.cpp:14:8: note: in call to ‘void Base::increase_cwnd()’
void increase_cwnd(){
fukusou.cpp: In function ‘int main()’:
fukusou.cpp:72:9: error: cannot declare variable ‘algo_1’ to be of abstract type ‘Tahoe’
Tahoe algo_1(1,250);
fukusou.cpp:25:7: note: because the following virtual functions are pure within ‘Tahoe’:
class Tahoe:public Base{
fukusou.cpp:22:16: note: virtual void Base::NEW_ssThresh() const
virtual void NEW_ssThresh() const=0;
fukusou.cpp:73:8: error: cannot declare variable ‘algo_2’ to be of abstract type ‘Reno’
Reno algo_2(1,250);
fukusou.cpp:33:7: note: because the following virtual functions are pure within ‘Reno’:
class Reno:public Base{
fukusou.cpp:22:16: note: virtual void Base::NEW_ssThresh() const
virtual void NEW_ssThresh() const=0;
fukusou.cpp:74:9: error: cannot declare variable ‘algo_3’ to be of abstract type ‘Cubic’
Cubic algo_3(1,250);
fukusou.cpp:41:7: note: because the following virtual functions are pure within ‘Cubic’:
class Cubic:public Base{
fukusou.cpp:22:16: note: virtual void Base::NEW_ssThresh() const
virtual void NEW_ssThresh() const=0;
C++
#include<iostream> #include<string> using namespace std; //基底 class Base{ protected: double cwnd; double ssThresh; public: Base(double CWND,double SSTHRESH):cwnd(CWND),ssThresh(SSTHRESH){}; void Timeout(){ cwnd=1; } void increase_cwnd(){ if(cwnd<ssThresh){ cwnd=cwnd*2; } else{ cwnd=cwnd+1/(cwnd); } } virtual void NEW_ssThresh() const=0; }; //派生 class Tahoe:public Base{ public: Tahoe(double CWND,double SSTHRESH):Base(CWND,SSTHRESH){}; void NEW_ssThresh() { ssThresh=ssThresh; } }; class Reno:public Base{ public: Reno(double CWND,double SSTHRESH):Base(CWND,SSTHRESH){}; void NEW_ssThresh() { ssThresh=cwnd/2; } }; class Cubic:public Base{ public: Cubic(double CWND,double SSTHRESH):Base(CWND,SSTHRESH){}; void NEW_ssThresh() { ssThresh=cwnd*0.8; } }; void simulate(string a[],const Base& algorithm){ int i=0; do{ if(a[i]=="timeout"){ algorithm.Timeout(); } else if(a[i]=="dup_ACK"){ algorithm.NEW_ssThresh(); } else if(a[i]=="ACK"){ algorithm.increase_cwnd(); } }while(a[i]=="0"); } int main(){ string array[50]; for(int i=0;i<50;i++){ array[i]="ACK"; } for(int i=0;i<50;i=i+10){ array[i]="dup_ACK"; } array[25],array[41]="timeout"; Tahoe algo_1(1,250); Reno algo_2(1,250); Cubic algo_3(1,250); simulate(array,algo_1); simulate(array,algo_2); simulate(array,algo_3); }
試したこと
c
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。