使用C ++进行实例级封装

时间:2013-03-07 17:11:46

标签: c++ encapsulation

我有一个由两部分组成的问题。首先,我理解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;
}

我想要做的是实际使这项工作,即,我想在一个类中定义一个变量,在每个实例化中是私有 (这是我的第二个问题)。由于上面的代码片段似乎没有实现这一点,我是否可以使用它来创建个别对象专用的数据?谢谢!

编辑:

我确实还在学习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'
}

有没有办法让里程表()方法返回福特或本田的里程数,取决于我想要的?

1 个答案:

答案 0 :(得分:1)

Priviledge(public,private,protected)仅适用于名称。只有在解析名称的时候,编译器才会应用权限。编译完成后,所有这些信息都消失了。

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

如果您将变量发布给其他对象,然后可以通过具有其他权限的其他名称引用该变量,则所有投注均已关闭。

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

我想有一些方法可以解决这个问题。首先是对你的类进行模板化,并为每个实例提供不同的类型。您可以使用整数模板参数或其他内容执行此操作。这可能会让生活变得烦人,因为当你尝试使用这些类型作为同类事物时。你必须虚拟化并拥有一个抽象的基类或其他东西。

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

一般来说,您很少想要保护其他实例的成员。传递给相同类型的相同类型的通常情况是在复制和分配期间,您基本上需要有关源的所有知识才能正确复制。我敢打赌,你需要重新思考你想要做的事情,无论是什么。