一个类中的类可以从外部类中调用getter方法吗?

时间:2019-05-29 10:38:23

标签: c++

我在一个班级里有一个班级。

外部类进行一些处理以生成值数组。

我希望内部类能够访问外部类的数组。

有没有一种干净的方法来实现这一目标?

我正在考虑在外部类中有一个方法,该方法在内部类中调用一个方法,向他发送数组的地址,并且内部类需要在其私有成员部分中保留一个指针,以便以后指向通过从接收地址的方法进行赋值来实现。但这感觉有些笨拙。

3 个答案:

答案 0 :(得分:1)

在构造时,您可以将外部类的引用传递给内部类的构造函数。使用引用,您可以调用外部类的任何函数。


// The actual definition of the inner class.
class inner {
  public:
    inner(outer& o) : outer_(o) // Set the reference.
    {

    }

    // The function using the data in outer.
    void do_stuff() 
    {
      int x = outer_.get_data() + 5;
    }

  private:
    // A reference to the outer class.
    outer& outer_;

}

// The actual outer class.
class outer {
 public:
   outer() : inner_(*this) // Set the reference using the this object.
   {

   }

   // This is the function you would like to call.
   int get_data();

 private:
   inner inner_;
}

答案 1 :(得分:0)

C ++具有嵌套类的概念。嵌套类,在另一个封闭类中声明。它是成员,并且与封闭类的任何其他成员具有相同的访问权限。但是,封闭类的成员对嵌套类的成员没有特殊的访问权限。您可以参考此示例代码。希望这会有所帮助

class Outer {       
   private:    
       int arry[]; 

   class inner { 
         private:
         int innerArr[];
      void Fun(Outer *e) { 
        innerArr = e->arry;   

      }        
   }; 
}; 
int main(){
Outer out;
Outer::inner in;
in.Fun(out);

}

答案 2 :(得分:0)

好的,这里已满。重点:

  • C ++具有嵌套类,但是这是100%的编译时处理范围和封装的事情,类实例是100%独立的。
  • 因此,如果您希望一个类以任何方式使用另一个,则它必须创建一个实例或接受一个实例。
  • (然后,给定一个外部实例,允许内部类访问其私有部分,这是唯一与常规作用域不同的东西)。

因此知道,这是一个具体示例。
 →Outer拥有Inners的向量。
 →内部需要使用其拥有的外部实例
➥说外层可能是某种列表,内层可能是某种项目

class Outer
{
public:  // can be private, in which case Inner won't be usable from outside
    class Inner
    {
        Outer & m_outer;
    public:
        Inner(Outer & outer) : m_outer(outer) {}
        void doOuterMagic() { m_outer.doMagic(); }
    };

public:
    void addInner() { m_inners.emplace_back(*this); }

private: // could be public, but I want to illustrate Inner access to private members
    void doMagic() { std::cout <<"magic"; }

private:
    std::vector<Inner> m_inners;
};

与任何类一样,如果可读性更好,也可以在外部类下定义它。您可以这样:

class Outer
{
public:  // can be private, in which case Inner won't be usable from outside
    class Inner;
public:

    // ... unchanged ...

};

class Outer::Inner  // note the scoping here
{
    // ... exactly what was in class Inner above
};

注释:

  • 外部和内部的任何关系都取决于您的设计,而C ++则不考虑任何关系。
  • 如果Outer与Inner紧密合作,就像我在addInner中所做的那样,让Outer创建Inner实例并将其自身传递给它们是很常见的。
  • 我已将m_outer用作参考,但这阻止Inner满足* Assignable要求。如果您需要类来满足这些要求,请改为使用指针。