invalid use of non-static data member

前端 未结 4 1978
暖寄归人
暖寄归人 2021-02-01 14:06

For a code like this:

class foo {
  protected:
    int a;
  public:
    class bar {
      public:
        int getA() {return a;}   // ERROR
    };
    foo()
             


        
相关标签:
4条回答
  • 2021-02-01 14:07

    You try to access private member of one class from another. The fact that bar-class is declared within foo-class means that bar in visible only inside foo class, but that is still other class.

    And what is p->param?

    Actually, it isn't clear what do you want to do

    0 讨论(0)
  • 2021-02-01 14:15

    In C++, unlike (say) Java, an instance of a nested class doesn't intrinsically belong to any instance of the enclosing class. So bar::getA doesn't have any specific instance of foo whose a it can be returning. I'm guessing that what you want is something like:

        class bar {
          private:
            foo * const owner;
          public:
            bar(foo & owner) : owner(&owner) { }
            int getA() {return owner->a;}
        };
    

    But even for this you may have to make some changes, because in versions of C++ before C++11, unlike (again, say) Java, a nested class has no special access to its enclosing class, so it can't see the protected member a. This will depend on your compiler version. (Hat-tip to Ken Wayne VanderLinde for pointing out that C++11 has changed this.)

    0 讨论(0)
  • 2021-02-01 14:19

    The nested class doesn't know about the outer class, and protected doesn't help. You'll have to pass some actual reference to objects of the nested class type. You could store a foo*, but perhaps a reference to the integer is enough:

    class Outer
    {
        int n;
    
    public:
        class Inner
        {
            int & a;
        public:
            Inner(int & b) : a(b) { }
            int & get() { return a; }
        };
    
        // ...  for example:
    
        Inner inn;
        Outer() : inn(n) { }
    };
    

    Now you can instantiate inner classes like Inner i(n); and call i.get().

    0 讨论(0)
  • 2021-02-01 14:32

    In C++, nested classes are not connected to any instance of the outer class. If you want bar to access non-static members of foo, then bar needs to have access to an instance of foo. Maybe something like:

    class bar {
      public:
        int getA(foo & f ) {return foo.a;}
    };
    

    Or maybe

    class bar {
      private:
        foo & f;
    
      public:
        bar(foo & g)
        : f(g)
        {
        }
    
        int getA() { return f.a; }
    };
    

    In any case, you need to explicitly make sure you have access to an instance of foo.

    0 讨论(0)
提交回复
热议问题