Как получить доступ к функции в базовом классе при использовании одноэлементного класса в качестве производного класса - PullRequest
0 голосов
/ 25 апреля 2018

Это заголовок класса генератора;

#ifndef GENERATOR_H
#define GENERATOR_H


class Generator
{
    public:
        Generator(int);
        ~Generator();
        int getBits();

    private:
        int bits;
};

#endif // GENERATOR_H

. Это заголовок прокси-класса, который является синглтон-классом, полученным из Generator;

#ifndef PROXY_H
#define PROXY_H
#include "Generator.h"

class Proxy: private Generator
{
    public:
        ~Proxy();
        static Proxy* getInstance(int);
        Generator * operator ->();
        int checkvalue();
    private:
        Proxy();
        Proxy(int);
        int bits;
        int counter;
        static Proxy* instance;
        Generator * rPointer;
};

#endif // GENERATORPROXY_H

. Это файл CPP для Прокси.

Proxy::Proxy(int inputbits):Generator(inputbits)
{
}

Proxy::~Proxy()
{

}
Generator * Proxy::operator ->()
{
    counter++;

    if(counter<=10)
    return rPointer;
    else
    return 0;
}

Proxy* Proxy::instance = 0;

Proxy* Proxy::getInstance(int inputbits)
{
    if(instance==0)
    {
        instance = new Proxy(inputbits);
    }

    return instance;

}

Вопрос: Когда я создаю прокси-объект в функции main, как я могу вызвать функцию getBits () в main?

Это часть основной функции:

Proxy* px = Proxy::getInstance(4);
cout << px->getBits() << endl;

Когда я попробовал это, ошибка произошла следующим образом: Чтобы получить доступ к Генератору в основном, я сделал оператор следующим образом: Generator * Proxy::operator ->(), который находится в файле CPP для прокси. Как я могу получить доступ к функции getBits () в основной функции? Спасибо всем за помощь.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Выпуск 1:

Наследование private означает, что все из базового класса Generator входит в private часть класса Proxy. Если функции public из Generator должны быть видны, то вам нужно сделать наследование public -или же- создайте public функцию в Proxy, которая вызывает необходимые функции в Generator

Выпуск 2:

Наследование используется, когда нам нужно использовать производные классы (многократно неизвестные классы) в определенном контексте. Базовый класс представляет абстрактную концепцию, лежащую в основе всех производных классов. И он используется как «общая» концепция для всех производных классов.

Другими словами: является ли Generator абстракция Proxy -или- это Proxy определенный тип Generator. Если нет, то я бы использовал состав (сделайте его переменной в Proxy).

Выпуск 3:

В комментариях также указано количество обращений к классу Generator. С наследованием класс Generator должен контролировать весь доступ к нему.

Так вот почему у вас есть Proxy класс. Это дополнительный уровень косвенности - это обертка для вашего Generator класса, он должен делегировать ему все вызовы.

Класс Proxy должен иметь все необходимые функции, которые необходимо вызвать. Это «защитник» класса Generator (возможно, поэтому используется наследование private).


Эти проблемы являются проблемами проектирования, для которых вам нужно решить, что лучше.

0 голосов
/ 25 апреля 2018

Чтобы использовать Proxy::operator->, вы должны сначала разыменовать px.Так что (*px)->getBits() должно сработать.

И, как говорит Эдуард Ростомян, вы должны использовать композит вместо наследования, поскольку прокси является , а не Генератором.

Кроме того, вы нигде не устанавливаете rPointer в своем примере кода и своем коде.

...