初学编程
操作系统LRU算法c++实现
private处报错
#include<iostream>
#include<list>
#include<stdlib.h>
#include<time.h>
using namespace std;
class LRU{
public:
LRU(){data=1;used=0;time=0;}
LRU(int d,int u,int t){
data = d;used = u;time = t;
}
void be_used();
friend class List;
// private:
int used;
int data;
int time;
};
void LRU::be_used(){
used++;
}
bool comp_used(LRU& p1,LRU& p2){
if(p1.used == p2.used){
return (p1.time < p2.time);
}else {
return (p1.used < p2.used);
}
}
class List{
public:
int lru(LRU& p,int num){
int interrupt_LRU = 1;
// cout<<p.data<<" "<<p.used<<endl;
for(list<LRU>::iterator it = l.begin();it!=l.end();++it){
if((*it).data == p.data){
// cout<<"no interrupt_LRU"<<endl;
it->be_used();
interrupt_LRU = 0;
}
}
if(interrupt_LRU){
// cout<<"interrupt_LRU"<<endl;
if(l.size()<num){
l.push_back(p);
// cout<<(*l.begin()).data;
}else {
l.pop_front();
l.push_front(p);
}
}
for(list<LRU>::iterator it = l.begin();it!=l.end();++it){
(*it).time++;
}
l.sort(comp_used);
/*
for(list<LRU>::iterator it = l.begin();it!=l.end();++it){
cout<<(*it).data<<" ";
}
cout<<endl;
cout<<endl;
*/
return interrupt_LRU;
}
private:
list<LRU> l;
};
int main(){
int num = 0;
int x = 0;
cout<<"输入页框数:";
cin>>num;
cout<<endl;
cout<<"输入访问页面序列长度:";
cin>>x;
cout<<endl;
List l;
int con_LRU = x;
int fail_LRU = 0;
while(con_LRU){
int a=rand()%9+1;
// cout<<"新页:"<<a<<endl;
LRU page(a,1,0);
// cout<<page.data<<" "<<page.used<<endl;
if(l.lru(page,num)){
fail_LRU++;
}
con_LRU--;
}
cout<<"LRU缺页中断率:"<<fail_LRU*100/x<<"%"<<endl;
return 0;
}
报错是因为 comp_used
函数访问了 private
关键字保护的属性。
其实你已经使用了一个 friend
,为何不再来一个?
#include<iostream>
#include<list>
#include<stdlib.h>
#include<time.h>
using namespace std;
class LRU{
public:
LRU(){data=1;used=0;time=0;}
LRU(int d,int u,int t){
data = d;used = u;time = t;
}
void be_used();
friend class List;
friend bool comp_used(LRU&, LRU&); // 声明 friend 函数
private:
int used;
int data;
int time;
};
void LRU::be_used(){
used++;
}
bool comp_used(LRU& p1,LRU& p2){
if(p1.used == p2.used){
return (p1.time < p2.time);
}else {
return (p1.used < p2.used);
}
}
class List{
public:
int lru(LRU& p,int num){
int interrupt_LRU = 1;
// cout<<p.data<<" "<<p.used<<endl;
for(list<LRU>::iterator it = l.begin();it!=l.end();++it){
if((*it).data == p.data){
// cout<<"no interrupt_LRU"<<endl;
it->be_used();
interrupt_LRU = 0;
}
}
if(interrupt_LRU){
// cout<<"interrupt_LRU"<<endl;
if(l.size()<num){
l.push_back(p);
// cout<<(*l.begin()).data;
}else {
l.pop_front();
l.push_front(p);
}
}
for(list<LRU>::iterator it = l.begin();it!=l.end();++it){
(*it).time++;
}
l.sort(comp_used);
/*
for(list<LRU>::iterator it = l.begin();it!=l.end();++it){
cout<<(*it).data<<" ";
}
cout<<endl;
cout<<endl;
*/
return interrupt_LRU;
}
private:
list<LRU> l;
};
int main(){
int num = 0;
int x = 0;
cout<<"输入页框数:";
cin>>num;
cout<<endl;
cout<<"输入访问页面序列长度:";
cin>>x;
cout<<endl;
List l;
int con_LRU = x;
int fail_LRU = 0;
while(con_LRU){
int a=rand()%9+1;
// cout<<"新页:"<<a<<endl;
LRU page(a,1,0);
// cout<<page.data<<" "<<page.used<<endl;
if(l.lru(page,num)){
fail_LRU++;
}
con_LRU--;
}
cout<<"LRU缺页中断率:"<<fail_LRU*100/x<<"%"<<endl;
return 0;
}
这样是可以通过编译的。