0

我有一个两部分的问题。首先,我了解 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'
}

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

4

1 回答 1

1

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

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

但是,如果您将变量分配给其他对象,则所有的赌注都将被取消,然后这些对象可以通过具有其他权限的其他名称来引用该变量。

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

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

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

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

于 2013-03-07T17:20:13.040 回答