错误、漏洞、问题 - 页 1055

 
zfs:
在你的资料中找到servicedesk。
谢谢你!
[删除]  
A100:
这里不存在矛盾,否则B就可以访问C.t,如下图所示,而B并不是从C派生出来的
在你的例子中,B应该可以访问C.t,我认为没有理由禁止它。
 
Zloy_Koldun:
在你的例子中,B应该可以访问C.t,我认为没有理由禁止它。

你们都很奇怪,你们混淆了类和实例。 我认为同一个类的另一个实例B也不应该有对t的访问。

受保护的字段应该只被自己的(同一B实例的,即这个)访问,而其他实例(甚至同一B类的)应该被关闭......这里让我重新命名一下,以便清楚。

class Человек
{
protected:
   int кошелёк;
};
class Мужчина : public Человек
{
   int fч( Человек& ч );
   int fм( Мужчина& м );
};
int Мужчина::fч( Человек& ч )  // 1
{
   кошелёк = 100;       // Всё в порядке.  моё.
   int s =  ч.кошелёк;   // protected member access error  вполне справедливо
   return s;
}
int Мужчина::fм( Мужчина& м )  // 2
{
   кошелёк = 100;       // Всё в порядке, кошелёк мой собственный
   int s = м.кошелёк;   // это компилируется.  и это НЕПРАВИЛЬНО! кошелёк ЧУЖОЙ !!
// С фига ли я должен иметь доступ к твоему кошельку, только на основании того что мы с тобой оба "Мужчины" ?? 
   return s;
}

在我看来--两个函数都不应该编译,而不仅仅是第一个。 如果在C++中,第二个函数可以编译并工作--那是C++的刺伤,而不是美德。

简而言之。

class Человек
{
protected:
   int кошелёк;
public:
   void Человек() {  a=3; }
   void gч( Человек& ч )
   {
    ч.кошелёк--;  // Даже это не должно компилироваться.  не следует лазить в чужой кошелёк!
    кошелёк++;    // в свой можно
   }   
};
[删除]  

你与钱包的比较是不正确的。

我可以给你一个例子,你需要访问被保护的成员,但这与我或你的喜好无关。

如果程序员想禁止什么,他可以自己做,而编译器必须禁止。

如果它有可能干扰程序。

在上面的例子中,B类知道A类的情况,所以它不会在那里乱来。

如果你想禁止它,就把它放在私人部分,或者不要从一个类中继承,或者想出一千种其他方法。

 
MetaDriver:


在我看来,两个函数都不应该被编译,而不仅仅是第一个。 如果在C++中,第二个函数可以被编译并工作,那就是C++的缺陷,而不是优点。

那么你的钱包也不会被访问。
Человек ч;
ч.gч( ч );
 
A100:
那么它的钱包也不会被访问

再一次:仔细区分类(类型)和实例(变量)。 自己的(本)proctored字段可以自由访问,也可以通过继承(与private不同),其他的(同一类的其他变量)一定不能访问。(应该是无法访问的)

Zloy_Koldun:
.....

在上面的例子中,B类知道A类的情况,所以它不会在那里乱来。

...............

仅仅因为我知道 你有一个钱包,并不是访问它的理由。 对你的钱包,请只通过get()和set()--如果你允许的话(公共:int get(); int set();)。

 
MetaDriver:


protected不是在对象层面上限制访问,而是在类层面上限制访问,因为它在编译的时候没有对象信息。我举了一个矛盾的例子
Человек ч;
ч.gч( ч );
对象是相同的
[删除]  
MetaDriver:

仅仅因为我知道 你有一个钱包,就没有理由访问它。 对你的--请。 对你的--只能通过get()和set()--如果你允许的话(public: int get(); int set();)。

钱包只是一个特殊情况。而且没有人阻止它被放在私人部分。

在另一种情况下,你可能需要访问 别人的对象的父类变量

而这要由程序员来决定是否允许。而编译器必须确保程序的正确运行。

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
A100:
我举了一个矛盾的例子......对象是一样的

不存在任何矛盾。如果你通过 "外部接口 "来指代自己,请做好被自己打脸的准备;)

...........,因为在编译的时候,它没有关于对象的信息

 
Zloy_Koldun:

1.钱包只是一个特殊情况。而且没有人阻止它被放在私人部分。

2.在另一种情况下,你可能需要访问 别人的对象的父类变量

3 而这要由程序员决定是否允许。

4.并由编译器来确保程序的正确运行。

1.把它放在私人部分不会改变任何事情,如果

class Человек
{
private:
   int кошелёк; 
public:
   void Человек() {  кошелёк=3; }
   void gч( Человек& ч )  
   { 
    ч.кошелёк--;   // сейчас работает.  а не должно ;)
   }
};

它将继承,这是显而易见的。

2.需要做的事情非常少。理由只有在访问你自己的副本时才能获得。

3.所以让他决定。 正确。;)

4.这就是整个问题: 究竟什么 算作 "正确的工作"。