【问题标题】:Is there any way to make a class function only callable from another class function?有没有办法让一个类函数只能从另一个类函数调用?
【发布时间】:2021-06-05 05:03:31
【问题描述】:

我正在开发一个小型 2D“渲染器”,它使用 从类中读取的参数在屏幕上绘制事物。绘图动作由一个大的 Renderer 类完成。 所以 ObjectParameters 类和 MainDrawing 类之间存在数据转换。 我使用声明一个公共函数以使 MainDrawing 的调用成为可能。但它也可以由其用户调用,并使类对象不安全

那么有什么方法可以使声明的类函数可被另一个类调用(但是方法是公共的、私有的或受保护的)?

class ObjectParameters {
public:
    COORD position;
    int Width;
    int Height;
    COLORREF elemColor;
private:
    int _zIndex;
public:
    ObjectParameters();
    ~ObjectParameters();

    /* This line is the code which won't be called by the user, 
    /* but MainDrawing class needs it for setting the layers.
    /* I don't want to make it callable from user, 
    /* because it can occur errors. */
    void Set_ZIndex(int newValue);

};

class MainDrawing {
public:
    MainDrawing();
    ~MainDrawing();
    
    /* Here will change the object's z-index to order the draw sequence,
    /* so it calls the Set_ZIndex() function */
    void AddThingsToDraw(ObjectParameters& object);
private:
    /* OTHER CODES */
};

【问题讨论】:

  • 也许您可以使用protectedpublic 继承?还是friend 函数声明?只是一个想法,我不知道这些是你的答案。
  • 有点不清楚你到底要什么。您能否编写一些示例调用代码,以便我们了解在什么情况下您希望该函数可访问以及在什么情况下您希望该函数不可访问?

标签: c++ class oop public


【解决方案1】:

使用friend 关键字:https://en.cppreference.com/w/cpp/language/friend

// Forward declaration. So that A knows B exists, even though it's no been defined yet.
struct B;

struct A {
    protected: 
    void foo() {}

    friend B;
};

struct B {
    void bar(A& a) {
        a.foo();
    }
};

int main()
{
    A a; B b;
    b.bar(a);

    //a.foo(); Not allowed
}

【讨论】:

  • 我会提请注意前向声明struct B;。这让 A 知道它将有一个名为 B 的朋友结构,而无需知道 B 的完整定义,直到代码后面才提供。
【解决方案2】:

您可以使私有函数成为嵌入式类的私有成员,如下所示:

class MyOuterClass
{
public:
    class MyInnerClass
    {
private:
        void MyPrivateFunction () {}
    public:
        void MyPublicFuncton ()
        {
            MyPrivateFunction ();
        }
    };
};

【讨论】:

    【解决方案3】:

    我得到的是你希望继承的类不能访问父类变量。为此,您只需将变量设为私有并将函数设为公开即可。并继承类作为保护,以便只有子类可以访问和使用该功能。 如果您想要代码,我也可以提供帮助。 第一种方法是声明它受保护并继承该类。

        class ObjectParameters {
        
            public:
        int Width;
        
        int Height;
        
            private:
        int _zIndex
    
    ;
    
        public:
       
    
         ObjectParameters();
    ~ObjectParameters();
    
        /* This line is the code which won't be called by the user,
        /* but MainDrawing class needs it for setting the layers.
        /* I don't want to make it callable from user,
        /* because it can occur errors. */
        protected:
       
    
         void Set_ZIndex(int newValue);
    
        };
    
        class MainDrawing:ObjectParameters {
    
        public:
    MainDrawing();
    
    ~MainDrawing();
    
    Set_ZIndex(5);
        /* Here will change the object's z-index to order the draw sequence,
        /* so it calls the Set_ZIndex() function */
        private:
        /* OTHER CODES */
        };
    

    第二种方法是在 ObjectParameters 中将 MainDrawing 声明为友元

    friend class MainDrawing 并将函数 Set_ZIndex() 设为私有,因此只有朋友类可以访问它

    【讨论】:

    • 没有代码,这个答案很难理解。
    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多