在C ++中,可以在运行时设置/更改类属性 - public,private或protected吗?

时间:2012-05-09 12:05:23

标签: c++ class attributes runtime

是否可以在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, 软质皮

3 个答案:

答案 0 :(得分:4)

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

所以不,你不能在运行时改变它。

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

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

答案 1 :(得分:2)

不,访问级别无法修改,但有一些黑客可以解决它们。

请参阅此回答 - https://stackoverflow.com/a/6886432/673730

如果您要查找的内容类似于Java反射,您可以通过在运行时修改其访问级别来访问私有成员,那么没有。

答案 2 :(得分:1)

您无法更改类的访问修饰符。故事结束。

免责声明:几乎所有内容都有黑客攻击,包括此。不要使用它们。

根据您在问到为什么要这样做时对问题的评论,看起来您尝试做的是根据其他运行时属性控制对类的运行时属性的访问。例如,只有当Character的{​​{1}}为&gt; = 42时才可以访问Powers Character

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

类通常用于对事物进行建模。在你的情况下,游戏中的角色。也许这个角色有一个等级和一系列权力(我将其简称为Level)。

在那种情况下:

string

...是您角色模型的简单表示。现在,如果您想根据class Character { public: int level_; vector<string> powers_; }; 的值在运行时控制对powers_的访问权限,则可以使用accessor method

level_

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

这仍然是一个非常简单的例子,上面的代码不是生产质量。但是,我们的想法是 - 在实现程序的业务逻辑时,您应该关注的是您编写的算法,而不仅仅是C ++的技术性,或者您正在使用的任何语言。