【问题标题】:Instance-level encapsulation with C++使用 C++ 进行实例级封装
【发布时间】:2013-03-07 17:11:45
【问题描述】:

我有一个两部分的问题。首先,我了解 C++ 仅提供类级别的数据封装,这意味着同一类的所有对象都可以访问彼此的私有成员。我理解其中的原因,但发现了一些似乎与这一点相矛盾的链接(即http://www.programmerinterview.com/index.php/c-cplusplus/whats-the-difference-between-a-class-variable-and-an-instance-variable/),这表明我可以执行以下操作:

class testclass {
  private:

  // Below would be an instance-level variable, and new memory for it is set aside 
  // in each object I create of class testclass 
  int x;

  // Below would be a class-level variable, memory is set aside only once no matter 
  // how many objects of the same class 
  static int y;
}

我想做的实际上是完成这项工作,即我想在一个类中定义一个变量,该变量在每个实例化中都是私有的(这是我的第二个问题)。由于上面的代码 sn-p 似乎无法实现这一点,是否有一种解决方法可以用来创建单个对象私有的数据?谢谢!

编辑:

确实,我还在学习 OO 基础知识。我将使用无处不在的汽车示例来展示我正在尝试做的事情,我确信这一定是一个常见的尝试。我欢迎任何关于如何重新思考它的建议:

class car {
  private:
    int mileage;
  public:
    car(int); // Constructor
    void odometer();
};

car::car(int m) {
  mileage = m;
}

void car::odometer() {
  return mileage;
}

int main(void) {
  car ford(10000), honda(20000);

  cout<<ford.odometer(); //Returns 20000, since honda constructor overwrites private variable 'mileage'
}

有什么方法可以让 odometer() 方法返回福特或本田的里程数,这取决于我想要什么?

【问题讨论】:

  • 第一个问题是什么?为什么要保护实例不访问彼此的成员变量?
  • //Returns 20000, since honda constructor overwrites private variable 'mileage' 这是完全错误的。你验证了吗?当然,它会覆盖它的自己的成员,但是为什么它会触及其他任何东西呢?

标签: c++ encapsulation


【解决方案1】:

特权(公共、私有、受保护)仅适用于名称。只有在解析名称时,编译器才会应用权限。编译后,所有这些信息都没有了。

在您上面的示例中,名称 x 和 y 在解析为 THOSE 变量的范围内的所有使用都将是您的类私有的。只有在您的类中声明的函数,无论它们是否是静态的,才能按名称访问这些变量。

但是,如果您将变量提供给其他对象,然后这些对象可以通过具有其他权限的其他名称引用该变量,那么所有的赌注都将失败。

我不确定您在提到“在每个实例化中”时要问什么。 AFAIK,没有本地方法可以将变量设为私有,这样只有该实例才能访问它。在所有情况下,实例都可以访问彼此的私有部分。

我想有一些方法可以解决这个问题。首先是模板化你的类并给每个实例一个不同的类型。您可以使用整数模板参数或其他东西来做到这一点。当您尝试将这些类型作为同一种事物使用时,这可能会使生活变得烦人。您必须进行虚拟化并拥有一个抽象基类之类的东西。

目前这是我能想到的唯一方法。所有其他人都依赖于调用实体玩得很好。

一般来说,您很少希望保护成员免受其他情况的影响。将相同类型传递给相同类型的通常情况是在复制和分配期间,您基本上需要有关源的所有知识才能正确复制。我敢打赌,你需要重新考虑你想要做什么,不管那是什么。

【讨论】:

  • @user1207789 - 根据您的编辑...我没有得到您所说的结果。使源可编译后:stacked-crooked.com/…
  • 嗯@crazyeddie,有趣的一点。但是,我看不出上面的示例与我实际尝试编写的程序之间的区别,但是您是对的,这个小示例并不能说明我的问题。我会在一天左右发布一个新问题。
  • 好吧,我在这里提出了一个更明确的问题:stackoverflow.com/questions/15303398/…
猜你喜欢
  • 2014-03-12
  • 2014-05-16
  • 2016-08-23
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2011-10-16
  • 2017-12-28
相关资源
最近更新 更多