Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+进行实例级封装+;_C++_Encapsulation - Fatal编程技术网

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

C++ 使用C+进行实例级封装+;,c++,encapsulation,C++,Encapsulation,我有一个由两部分组成的问题。首先,我理解C++只提供类级数据封装,这意味着同一类的所有对象都可以访问彼此的私有成员。我理解这一点的原因,但发现一些链接(即)似乎与这一点相矛盾,表明我可以做以下工作: class testclass { private: // Below would be an instance-level variable, and new memory for it is set aside // in each object I create of clas

我有一个由两部分组成的问题。首先,我理解C++只提供类级数据封装,这意味着同一类的所有对象都可以访问彼此的私有成员。我理解这一点的原因,但发现一些链接(即)似乎与这一点相矛盾,表明我可以做以下工作:

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;
}
我想做的是真正做到这一点,也就是说,我想在一个类中定义一个变量,它在每个实例化中都是私有的(这是我的第二个问题)。由于上面的代码片段似乎无法实现这一点,我是否可以使用一些变通方法来创建单个对象专用的数据?谢谢大家!

编辑:

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

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'
}
等级车{
私人:
国际里程;
公众:
car(int);//构造函数
空隙里程表();
};
汽车:汽车(整数米){
里程=m;
}
无效汽车::里程表(){
返程里程;
}
内部主(空){
福特汽车(10000辆)、本田汽车(20000辆);
coutPriviledge(public、private、protected)仅适用于名称。只有在解析名称时,编译器才会应用权限。一旦编译,所有此类信息都将消失

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

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

我不确定你在“每个实例化”中问了什么。好吧,没有一种本机方法可以使变量私有化,只有该实例可以访问它。在所有情况下,实例都可以访问彼此的私有部分

我想有一些方法可以解决这个问题。首先是对类进行模板化,给每个实例一个不同的类型。你可以用一个整数模板参数或其他什么东西来实现这一点。这可能会让生活变得烦人,因为你试图将这些类型作为同一种事情来处理。你必须进行虚拟化,并有一个抽象基类什么的

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


一般来说,很少有人希望保护成员不受其他实例的影响。在复制和分配过程中,通常会将同一类型传递给同一类型,在这种情况下,您基本上需要了解源代码的所有信息才能正确复制。我敢打赌,您需要重新思考您正在尝试做的事情,不管是什么。

什么是第一个问题?为什么要保护实例不访问彼此的成员变量?
//返回20000,因为honda constructor覆盖了私有变量“Miledge”
这是完全错误的。您验证了吗?它覆盖了自己的成员,当然,但为什么它会触及其他任何内容?@user1207789-根据您的编辑。。。我没有得到你说你得到的结果。在使源代码可编译之后:Hm@crazyeddie,有趣的一点。我看不出上面的示例和我实际上试图编写的程序之间的区别,但是你是对的,这个小示例没有说明我的问题。我将在一天左右后发布一个新问题。好的,我已经开始了这里有一个更清楚的问题: