1

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

我有一些简单的嵌套类,因此它们可以在没有额外输入的情况下与变量交互,但我的编译器给了我一个错误。我如何允许他们在不使用 &time 作为函数输入或在 Vect 类中包含变量 &time 的情况下进行交互?

我尝试使用相同的逻辑,您可以访问仅在代码中的数据,与函数原型位于相同的位置,而是包装在一个类中。这适用于我使用过的任何东西,除了其他类。谁能解释为什么?

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

/*********/
#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;
}
4

4 回答 4

4

您收到错误的原因(即使您没有发布实际错误,我也设法弄清楚了,请以后再做),是您实际上在函数中没有类的实例班级。您可能应该考虑这里的设计,但要快速解决它(并且“肮脏”),您可以添加一个在子类中设置实例的函数:ContainerVectContainer

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

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

于 2012-11-09T07:20:16.493 回答
2

“......嵌套类的成员对封闭类的成员没有特殊的访问权限,也没有对已授予封闭类友好的类或函数的特殊访问权限;应遵守通常的访问规则(第 11 条)。封闭类对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则(第 11 条)。..."

因此,让他们成为朋友。

于 2012-11-09T07:31:33.740 回答
2

内部类不能访问外部类的非静态变量。这是 C++,我们必须在使用它的非静态成员数据之前实例化该对象。所以如果你想使用你的设计,你有两个选择:

  1. 将变量(在您的情况下为时间)更改为静态。但是对于所有 Container 类,您只有一份时间副本。

  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;
    };
于 2012-11-09T07:37:29.607 回答
0

基本上,类是对等的类。在 OOPs 原则中,每个类都被封装。那么内部类如何直接访问另一个类的成员。它违反了OOP的基本原则。

于 2012-11-09T07:27:13.627 回答