2

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

4

3 回答 3

4

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

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

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

int Class::function(...)
{
    if (!function_is_allowed)
        return OPERATION_NOT_ALLOWED;
    ...
}
于 2012-05-09T12:10:00.120 回答
2

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

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

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

于 2012-05-09T12:06:25.717 回答
1

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

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

当被问及为什么要这样做时,根据您在问题中的评论,看起来您正在尝试做的是根据类的其他运行时属性控制对类的运行时属性的访问。例如,也许只有当's >= 42时才能访问 a Character's 。PowersCharacterLevel

这不是关于 C++ 语法机制的技术问题,而是业务逻辑问题。您将在程序及其算法的设计中找到这个问题的答案——而不是一些技术性的 C++ 技巧。

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

在这种情况下:

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

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

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

现在,只有当角色的等级足够高时,您才能获得角色的力量。

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

于 2012-05-09T14:56:56.320 回答