代码之家  ›  专栏  ›  技术社区  ›  Thomas Wagenaar

如何在类[duplicate]中拥有子函数

c++
  •  0
  • Thomas Wagenaar  · 技术社区  · 6 年前

    A a

    a.control.fire();
    

    fire() 可以访问的变量 . 我尝试了以下方法:

    #pragma once
    
    using namespace std;
    
    class A {
    public:
        double c;
    
        struct Controller {
            double fire () { return c * 2};
        };
    
        Controller control;
    
        A();
    };
    

    a.control.fire() 但在尝试访问时会出现错误 c . 我怎样才能解决这个问题?

    2 回复  |  直到 6 年前
        1
  •  -1
  •   Robert Andrzejuk    6 年前

    Nested classes on cpprefrence.com

    与封闭类的任何成员一样,嵌套类可以访问封闭类可以访问的所有名称(private、protected等), 否则 this 封闭类的指针。

    内部的 上课的时候 类已创建。政府也没有 内部的 外面的

    所以 Controller 需要两件事:

    • 对变量c的引用或其类的实例化: double& ref_c A& a
    • 初始化的构造函数 ref_c a

    A controller c *this (也可以使用聚合初始化)。


    例子:

    class Outer // Enclosing
    {
    public:
        double c;
    
        struct Inner // Nested
        {
            const Outer& a;
    
            double fire() const { return a.c * 2; };
        };
    
        Inner control { *this };
    
        Outer();
    };
    
        2
  •  -2
  •   Galaxy    6 年前

    里面有两个水密容器 class A : double c struct Controller . 从一个内部你无法到达另一个。C++抽象层中的规则是不能从内到外。你只能从外到内。 Controller::fire() 只能看到里面的东西 Controller 它自己。它对外界一无所知。

    您可以通过去掉 一起。它是一堵“墙”,阻止你的功能看到

        #pragma once
    
    using namespace std;
    
    class A {
    public:
        double c;
    
        double fire () { return c * 2};
    
    
        A();
    };
    

    另一种方法是通过“墙”提供某种“门”,某种机制来获取信息 双c 控制器 double fire() . 我是说声明一个构造函数 Controller::Controller()

    #pragma once
    
    using namespace std;
    
    class A {
    public:
        double c;
    
        struct Controller {
            Controller(double* ptr) : c_ptr(ptr) {}
            double * c_ptr;
            double fire () { return *c_ptr * 2};
        };
    
        Controller control(&c);
    
        A();
    };
    

    正如在另一个答案中提到的,你也可以在C++中使用引用。在这种情况下,这样做会更好。

    #pragma once
    
    using namespace std;
    
    class A {
    public:
        double c;
    
        struct Controller {
            Controller(double& input) : c(input) {}
            double& c;
            double fire () { return c * 2};
        };
    
        Controller control(c);
    
        A();
    };