Это основной класс.
int main()
{
Handler1 handler_1;
Handler2 handler_2;
Handler3 handler_3;
Handler4 handler_4;
handler_1.add(&handler_2);
handler_1.add(&handler_3);
handler_1.add(&handler_4);
//handler_4.setNext(&handler_1);
for (int i = 1; i < 20; i++)
{
//srand(time(0));
Proxy* px = Proxy::getInstance(4);
Proxy* newProxy = px->checkvalue();
if(newProxy!=0)
{
handler_1.handle(newProxy->getvalue());
cout << " =====< " << i << " access>" <<endl;
}
else
{
cout << "\n=====Access is higher than 10, program exit=====" << endl;
return 0;
}
cout << '\n';
}
}.Это часть класса Proxy, который является частным подклассом (singleton) из класса Generator
Proxy::Proxy(int inputbits):Generator(inputbits)
{
}
Proxy::~Proxy()
{
}
int Proxy::getvalue()
{
return getBits();
}
Proxy* Proxy::checkvalue()
{
counter++;
//int value = getBits();
if(counter>10)
return 0;
else
return this;
}
Generator * Proxy::operator ->()
{
counter++;
if(counter<=10)
return rPointer;
else
return 0;
}
Proxy* Proxy::instance = 0;
Proxy* Proxy::getInstance(int inputbits)
{
if(instance==0)
{
cout << "here" << endl;
instance = new Proxy(inputbits);
}
return instance;
}
.Это часть класса Generator, который является базовым классом класса Proxy.
Generator::Generator(int inputbits):bits(inputbits)
{
srand(time(NULL));
bits=rand() % int(pow(2, inputbits));
cout << bits << endl;
}
Generator::~Generator()
{
}
int Generator::getBits()
{
return bits;
}
.
This is sample out in main function.
H1 passed 11 H2 passed 11 H3 passed 11 H4 handled 11 =====< 1 access>
H1 passed 11 H2 passed 11 H3 passed 11 H4 handled 11 =====< 2 access>
H1 passed 11 H2 passed 11 H3 passed 11 H4 handled 11 =====< 3 access>
H1 passed 11 H2 passed 11 H3 passed 11 H4 handled 11 =====< 4 access>
H1 passed 11 H2 passed 11 H3 passed 11 H4 handled 11 =====< 5 access>
Как вы можете видеть выше, я получаю такое же значение, как 11 здесь,но я ожидал, что я хочу получить случайное значение, которое генерируется в конструкторе генератора.Но из того, что я попробовал, я выяснил цикл for в main, я добавил пример кода, этот Proxy* px = Proxy::getInstance(4);
, хотя я включил этот код в цикл for, он просто идет один раз.Чтобы объяснить мою логику здесь, чтобы получить числа, сгенерированные случайным образом, сначала создайте экземпляр класса Proxy и вызовите getInstance (), а затем это значение, равное 4, перейдите в конструктор Generator, и я могу получить некоторое значение из функции getvalue в классе Proxy.Но я обнаружил, что в конструкторе Generator генерируется только одно значение.Извините за мои неупорядоченные записи.И наконец, вопрос: как я могу генерировать случайные числа здесь ..?(как ввести функцию в цикл for, например Proxy* px = Proxy::getInstance(4);
в основной функции)
Отредактированный весь код -
#include "Base.h"
void Base::setNext(Base *n)
{
next = n;
}
void Base::add(Base *n)
{
if(next)
next->add(n);
else
next = n;
}
void Base::handle(int i)
{
next->handle(i);
}
#include "Handler1.h"
#include "Base.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
void Handler1::handle(int i)
{
if(i>2)
{
cout << "H1 passed " << i << " ";
Base::handle(i);
}
else
cout << "H1 handled " << i << " ";
}
#include "Handler2.h"
#include "Base.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
void Handler2::handle(int i)
{
if(i>4)
{
cout << "H2 passed " << i << " ";
Base::handle(i);
}
else
cout << "H2 handled " << i << " ";
}
#include "Handler3.h"
#include "Base.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
void Handler3::handle(int i)
{
if(i>6)
{
cout << "H3 passed " << i << " ";
Base::handle(i);
}
else
cout << "H3 handled " << i << " ";
}
#include "Handler4.h"
#include "Base.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
void Handler4::handle(int i)
{
cout << "H4 handled " << i << " ";
}
#ifndef BASE_H
#define BASE_H
class Base
{
Base *next;
public:
Base(): next(0) {};
void setNext(Base*);
void add(Base*);
virtual void handle(int);
private:
};
#endif // BASE_H
#ifndef HANDLER1_H
#define HANDLER1_H
#include "Base.h"
class Handler1: public Base
{
public:
void handle(int);
};
#endif // HANDLER1_H
#ifndef HANDLER2_H
#define HANDLER2_H
#include "Base.h"
class Handler2: public Base
{
public:
void handle(int);
};
#endif // HANDLER2_H
#ifndef HANDLER3_H
#define HANDLER3_H
#include "Base.h"
class Handler3: public Base
{
public:
void handle(int);
};
#endif // HANDLER3_H
#ifndef HANDLER4_H
#define HANDLER4_H
#include "Base.h"
class Handler4: public Base
{
public:
void handle(int);
};
#endif // HANDLER4_H
#include "Generator.h"
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
Generator::Generator(int inputbits):bits(inputbits)
{
srand(time(NULL));
bits=rand() % int(pow(2, inputbits));
cout << bits << endl;
}
Generator::~Generator()
{
}
int Generator::getBits()
{
return bits;
}
#ifndef GENERATOR_H
#define GENERATOR_H
class Generator
{
public:
Generator(int);
~Generator();
int getBits();
private:
int bits;
unsigned long int sequence;
};
#endif // GENERATOR_H
#include "Generator.h"
#include "Proxy.h"
#include <iostream>
using namespace std;
Proxy::Proxy(int inputbits):Generator(inputbits)
{
}
Proxy::~Proxy()
{
}
int Proxy::getvalue()
{
return getBits();
}
Proxy* Proxy::checkvalue()
{
counter++;
//int value = getBits();
if(counter>10)
return 0;
else
return this;
}
Generator * Proxy::operator ->()
{
counter++;
if(counter<=10)
return rPointer;
else
return 0;
}
Proxy* Proxy::instance = 0;
Proxy* Proxy::getInstance(int inputbits)
{
if(instance==0)
{
cout << "here" << endl;
instance = new Proxy(inputbits);
}
return instance;
}
#ifndef PROXY_H
#define PROXY_H
#include "Generator.h"
class Proxy: private Generator
{
public:
~Proxy();
static Proxy* getInstance(int);
Generator * operator ->();
Proxy* checkvalue();
int getvalue();
private:
Proxy();
Proxy(int);
int bits;
int counter;
static Proxy* instance;
Generator * rPointer;
};
#endif // GENERATORPROXY_H
#include <iostream>
#include "Generator.h"
#include "Base.h"
#include "Proxy.h"
#include <stdlib.h>
#include <time.h>
#include "Handler1.h"
#include "Handler2.h"
#include "Handler3.h"
#include "Handler4.h"
using namespace std;
int main()
{
Handler1 handler_1;
Handler2 handler_2;
Handler3 handler_3;
Handler4 handler_4;
handler_1.add(&handler_2);
handler_1.add(&handler_3);
handler_1.add(&handler_4);
//handler_4.setNext(&handler_1);
for (int i = 1; i < 20; i++)
{
//srand(time(0));
cout<< "kiyayaya" <<endl;
Proxy* px = Proxy::getInstance(4);
cout<< "yogiyo" <<endl;
Proxy* newProxy = px->checkvalue();
cout<< "success" <<endl;
if(newProxy!=0)
{
handler_1.handle(newProxy->getvalue());
cout << " =====< " << i << " access>" <<endl;
}
else
{
cout << "\n=====Access is higher than 10, program exit=====" << endl;
return 0;
}
cout << '\n';
}
}