получая то же значение и не может получить доступ к функции в цикле for, он просто выполняется один раз в c ++ - PullRequest
0 голосов
/ 26 апреля 2018

Это основной класс.

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';
    }
}
...