C++ 内部类无法访问外部类的成员

C++ Inner class not able to access Outer class's members

本文关键字:成员 外部 访问 内部类 C++      更新时间:2023-10-16

可能的重复:
内部类可以访问私人变量吗?
内类访问外班

我有一些简单的类嵌套,因此它们可以与变量相互作用而无需额外的输入,但是我的编译器给了我一个错误。我如何允许他们在不使用&时间作为函数输入或在VECT类内部的变量;的时间进行交互?

我尝试使用相同的逻辑,其中您可以在与函数原型相同的位置访问的数据访问的数据,而是包裹在类中。除其他类外,这对我使用的任何东西都很好。谁能解释为什么?

我已经标记了使用有问题的时间变量与定义之前的评论行的地方。

/*********/
#define MAX_POLY 3
class Container
{
public:
    Container(void);
    ~Container(void);
    float time;/*********/
    class Vect
    {
        float P[MAX_POLY],iT;
    public:
        Vect(void){iT = 0.0f;P = {0,0,0};}
        ~Vect(void);
        float GetPoly(int n){return P[n];}
        float Render(void)
        {
            float t = time - iT;/*********/
            float temp[2] = {0,0};
            for(int n=0;n<MAX_POLY;n++)
            {
                temp[0] = P[n];
                for(int m=0;m<n;m++)
                    temp[0] *= t;
                temp[1] += temp[0];
            }
            return temp[1];
        }
        void SetPoly(int n,float f)
        {
            float t = time-iT;/*********/
            P[0] = P[2]*t*t + P[1]*t + P[0];
            P[1] = 2*P[2]*t + P[1];
            //P[2] = P[2];
            P[n] = f;
            iT = time;/*********/
        }
    }X;
};
int main()
{
    Container Shell;
    Shell.X.SetPoly(0,5);
    Shell.X.SetPoly(1,10);
    Shell.X.SetPoly(2,-1);
    for(int n=0;n<10;n++)
    {
        Shell.time = (float)n;
        cout << n << " " << Shell.X.Render() << endl;
    }
    system("pause");
    return 0;
}

您遇到错误的原因(即使您没有发布实际错误,我还是设法弄清楚了,请在将来这样做)在Vect类功能中具有Container类的实例。您可能应该在这里考虑设计的设计,但是要快速解决("脏"),您可以添加一个在子类中设置Container实例的函数:

class Container
{
    ...
    class Vect
    {
        Container *container;
    public:
        void SetContainer(Container &container)
            { this->container = &container; }
        float Render(void)
            {
                float T = container->time - iT;
                ...
            }
        ...
    } X;
};
int main()
{
    Container Shell;
    Shell.X.SetContainer(Shell);
    Shell.X.SetPoly(0,5);
    ...
}

编辑:使用构造函数设置对父对象的引用(感谢Juanchopanza):

class Container
{
    ...
    Container()
        : X(*this)
        { ... }
    class Vect
    {
        Container& container;
    public:
        Vect(Container& cont)
            : container(cont)
            { }
        float Render(void)
            {
                float T = container.time - iT;
                ...
            }
        ...
    } X;
};

我仍然认为这是一种肮脏的解决方案(但不像我的第一个更脏),您应该考虑更改设计。

" ...嵌套班的成员无法特殊访问封闭班的成员,也没有授予封闭类友谊的类或功能;通常的访问规则(第11条)应遵守。封闭班的成员对嵌套班的成员没有特殊的访问权;通常的访问规则(第11条)应遵守。..."

因此,让他们成为朋友。

内类无法访问外部类的非静态变量。这是C ,我们必须在使用其非静态成员数据之前实例化对象。因此,如果您想使用设计,则有两种选择:

  1. 将变量(在您的情况下)更改为静态。但是您只有所有容器类的时间副本。

  2. 有嵌套类以包含指向父类的指针。以下代码类似于Joachim的解决方案,但我们不需要明确设置父。

class Container {
    public:
      Container() : X(this) {}
      float time;
      class Vect {
      public:
        Vect(Container* parent) : parent_(parent) {}
        void foo() {
          myT = parent->time;
        }
      private:
        Container * parent_;
      } X;
    };

最大程度地说,类是类似的类。用原理封装了每个类。因此,内部类如何直接访问其他类的成员。它违反了OOP的基本原则。