【问题标题】:In C++ can a class attributes - public,private or protected be set/changed at run-time?在 C++ 中,可以在运行时设置/更改类属性 - 公共、私有或受保护吗?
【发布时间】:2012-05-17 22:43:15
【问题描述】:

是否可以在C++语言中在运行时更改类属性。例如如下:

class base
{
    public:
        //public members

    private : 
        //private members
};

class derived1 : attribute base
{
    public:
        //public members
        base::<base method name> //so that it an be made accessible from the main - outside the class.

    private:
        //private members
};

属性-public,private,protected 可以在运行时动态更改吗?

Rgds, 软软的

【问题讨论】:

  • 在您的示例中,受保护的方法在编译时变为公共,而不是在运行时。通常,C++ 中的私有/受保护/公共区别在运行时会消失,因为该语言不允许 反射。这会使您的问题毫无意义,除非您的意思完全不同。
  • 告诉我们您为什么想要这个,我们可以向您展示更好的方法。
  • 我不能详细告诉你,但考虑一下这个高层次的想法。一个游戏角色正在尝试访问权力(一个类功能),但他只有在获得 X(一些权力1类;s 功能)时才能访问它们,如果他试图访问权力而没有获得权力1,他将不会允许(除非他拥有power1,否则不允许继承权力),以至于一旦继承了power1就改变power的属性,以便可以访问其功能(可以使用power)。它的想法很乱,但我希望你能得到这个想法。你有吗

标签: c++ class attributes runtime


【解决方案1】:

编译器确保您不访问private 成员。一旦编译器完成工作并生成二进制代码,所有关于隐私的信息都会丢失。

所以不,您不能在运行时更改它。

我不知道你为什么想要这个,但是如果你想让某些函数在某些时候能够被调用,而不是其他的,你可以有一个变量来定义它们是否可以被调用。然后,在该函数的顶部:

int Class::function(...)
{
    if (!function_is_allowed)
        return OPERATION_NOT_ALLOWED;
    ...
}

【讨论】:

    【解决方案2】:

    不,不能修改访问级别,尽管有一些技巧可以绕过它们。

    参考这个答案 - https://stackoverflow.com/a/6886432/673730

    如果您正在寻找类似于 Java 反射的东西,您可以在其中通过在运行时修改其访问级别来访问私有成员,那么不。

    【讨论】:

      【解决方案3】:

      您不能更改类的访问修饰符。故事结束。

      免责声明:几乎所有东西都有黑客攻击,包括这个。不要使用它们。

      当被问及为什么要这样做时,根据问题中的 cmets,您似乎想要做的是根据类的其他运行时属性控制对类的运行时属性的访问。例如,CharacterPowers 可能只有在 CharacterLevel >= 42 时才能访问。

      这不是关于 C++ 语法机制的技术问题,而是business logic 问题。你会在你的程序及其算法的设计中找到这个问题的答案——而不是一些技术性的 C++ 技巧。

      类通常用于建模事物。在你的情况下,游戏中的一个角色。也许这个角色有一个等级和一个权力列表(我将简单地表示为strings)。

      在这种情况下:

      class Character
      {
      public:
        int level_;
        vector<string> powers_;
      };
      

      ...是您的角色模型的简单表示。现在,如果您想在运行时根据level_ 的值控制对powers_ 的访问,您可以使用accessor method

      class Character
      {
      public:
        int level_;
        vector<string> Powers() const 
        {
          if( level_ >= 42 )
            return powers_;
          else
            return vector<string>();
        }
      private:
        vector<string> powers_;
      };
      

      现在你只有在角色等级足够高的情况下才能获得角色的力量。

      这仍然是一个高度简单化的例子,上面的代码不是生产质量的。但是,想法是存在的——在实现程序的业务逻辑时,您的重点应该放在您编写的算法上,而不是 C++ 的技术性或您使用的任何语言。

      【讨论】:

        猜你喜欢
        • 2023-04-08
        • 2012-06-02
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 2013-10-10
        • 2012-12-05
        • 2011-05-27
        • 2019-02-14
        相关资源
        最近更新 更多