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

时间:2012-11-09 07:13:06

标签: c++

  

可能重复:
  Can inner classes access private variables?
  Inner class accessing outer class

我有一些嵌套的简单类,所以他们可以在没有额外输入的情况下与变量交互,但是我的编译器给了我一个错误。如何在不使用& time作为函数输入或在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;
}

4 个答案:

答案 0 :(得分:2)

你收到错误的原因(即使你没有发布实际错误,我设法弄明白了,请将来再做),是你实际上没有实例Container类函数内的Vect类的em>。您可能应该考虑这里的设计,但要快速解决(并且“脏”),您可以添加一个在子类中设置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;
};

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

答案 1 :(得分:2)

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

因此,让他们成为朋友。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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