【问题标题】:How to access the function in base class when using singleton class as a derived class使用单例类作为派生类时如何访问基类中的函数
【发布时间】:2018-10-06 04:59:05
【问题描述】:

它是生成器类的头;

#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 函数中创建一些代理对象时,如何在 main 函数中调用 getBits() 函数?

这是主要功能的一部分:

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

当我尝试它时,错误发生如下:int Generator::getBits() is inaccessible. Generator is not an accessible base of Proxy. 我可以在 main 中访问生成器的方式,我制作了这样的运算符:Generator * Proxy::operator -&gt;(),它位于代理的 CPP 文件中。如何访问 main 函数中的 getBits() 函数?谢谢大家的帮助。

【问题讨论】:

  • 为什么是继承private Generator
  • @RobertAndrzejuk 这是单例类的声明,以防止任何用户访问 Generator 类。
  • 你刚刚回答了你自己的问题。
  • 嗯,所以你的意思是我不能访问生成器类中的函数?我想将 Generator 类的访问限制为 10 次。
  • 我需要调用函数在main函数中使用operator->,可以吗?

标签: c++ inheritance singleton private


【解决方案1】:

问题 1:

继承是private,这意味着基类Generator 中的所有内容都将进入Proxy 类的private 部分。 如果 Generator 中的 public 函数是可见的,那么你需要继承 public -要么- 在Proxy 中创建一个public 函数,该函数调用Generator 中所需的函数

问题 2:

当我们需要在特定上下文中使用派生类(很多时候是未知类)时,会使用继承。 Base 类代表了所有 Derived 类背后的抽象概念。它被用作所有派生类之间的“通用”概念。

换句话说:GeneratorProxy 的抽象 - 或者 - ProxyGenerator 的特定类型。 如果没有,那么我会使用组合(将其设为Proxy 中的变量)。

问题 3:

在 cmets 中,对 Generator 类的访问次数也有要求。通过继承,Generator 类必须控制对它的所有访问。

所以这就是为什么你有一个Proxy 类。这是一个额外的间接级别 - 它是您的 Generator 类的包装器,它应该将所有调用委托给它。

Proxy 类应该有所有需要调用的函数。它是Generator 类的“保护者”(这可能就是使用private 继承的原因)。


这些问题是设计问题,你必须决定什么是最好的。

【讨论】:

    【解决方案2】:

    要使用Proxy::operator-&gt;,您必须首先取消引用px。所以(*px)-&gt;getBits() 应该可以解决问题。

    正如 Eduard Rostomyan 所说,您应该使用复合而不是继承,因为代理不是生成器。

    此外,您没有在代码示例和代码中的任何位置设置 rPointer。

    【讨论】:

    • 不幸的是,代码可以运行,但是当它运行代码时,程序被关闭了。
    • 我在 Proxy 标头中设置了 rPointer。
    • @GideokSeong:您能否也发布您将值分配给 rPointer 的代码?将Generator *rPointer; 替换为Generator generator; 并在operator-&gt; 中返回&amp;generator 也可能更容易。这样你就摆脱了 Proxy 类中的继承。
    猜你喜欢
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2019-07-25
    相关资源
    最近更新 更多