Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ 当前的ODR对于定义“不同”的原因非常严格(因此对于实现非常慷慨,允许外观非常相似的定义之间存在二进制不兼容)。我认为在规则中引入这种例外情况的文本会很复杂 最终,它可能归结为“设计者想要这样”,或者可能是有人尝试过,遇到了我没有想到的障碍。 < P>一个_C++_Class_Function_Private_Declaration - Fatal编程技术网

C++ 当前的ODR对于定义“不同”的原因非常严格(因此对于实现非常慷慨,允许外观非常相似的定义之间存在二进制不兼容)。我认为在规则中引入这种例外情况的文本会很复杂 最终,它可能归结为“设计者想要这样”,或者可能是有人尝试过,遇到了我没有想到的障碍。 < P>一个

C++ 当前的ODR对于定义“不同”的原因非常严格(因此对于实现非常慷慨,允许外观非常相似的定义之间存在二进制不兼容)。我认为在规则中引入这种例外情况的文本会很复杂 最终,它可能归结为“设计者想要这样”,或者可能是有人尝试过,遇到了我没有想到的障碍。 < P>一个,c++,class,function,private,declaration,C++,Class,Function,Private,Declaration,当前的ODR对于定义“不同”的原因非常严格(因此对于实现非常慷慨,允许外观非常相似的定义之间存在二进制不兼容)。我认为在规则中引入这种例外情况的文本会很复杂 最终,它可能归结为“设计者想要这样”,或者可能是有人尝试过,遇到了我没有想到的障碍。 < P>一个原因是C++朋友可以访问你的私有。要让朋友访问它们,朋友必须了解它们 您是在问为什么必须声明函数本身,还是在问为什么必须对这些函数说private。我只是不知道为什么包括我的头在内的其他类必须知道它的私有函数private和virtual是正交

当前的ODR对于定义“不同”的原因非常严格(因此对于实现非常慷慨,允许外观非常相似的定义之间存在二进制不兼容)。我认为在规则中引入这种例外情况的文本会很复杂



最终,它可能归结为“设计者想要这样”,或者可能是有人尝试过,遇到了我没有想到的障碍。

< P>一个原因是C++朋友可以访问你的私有。要让朋友访问它们,朋友必须了解它们

您是在问为什么必须声明函数本身,还是在问为什么必须对这些函数说
private
。我只是不知道为什么包括我的头在内的其他类必须知道它的私有函数
private
virtual
是正交概念。函数是
private
这一事实并不意味着它不是
virtual
(事实上,关于只有
private
virtual
public
非virtual成员函数有一个完整的习惯用法),所以是的,存在会影响vtable。@DavidRodríguez dribea很好。实际上,我不知道虚拟私有函数可以在子类中重写,并让它们的基类调用新版本,而不公开可调用性(这是一个词吗?)@Ancurio:你想要的词是“可访问性”。是的,但是规范为什么说必须声明它们?你没有回答这个问题。已经有规则规定函数必须在调用之前声明,所以不是这样。(名称空间技巧是一个很好的技巧)是的,我习惯于使用静态C函数在C中隐藏实现,这就是为什么我希望在cpp中声明(在任何实现之前)私有函数,而不是其他函数,就像在cpp中的静态声明一样C@Ancurio,即使你说的完全有道理,不幸的是,没有C++支持将类定义分成两个部分:使用之前声明的签名仅仅与它们必须在类本身中的原因有关。friendzoned类不需要知道其他类的private,它的成员函数定义需要知道private。那也可以迟一点/在课外。使用模板可以做一些有趣的事情,可以说是将类定义一分为二。这提醒了我,带有内联函数的类定义是两个过程,而不是一个过程。这就是为什么在声明成员之前可以在成员函数定义中使用成员/函数的原因。@MooingDuck,事实上,我知道类声明本身的传递不是一个传递。但是,这仍然适用,因为大多数情况下,在声明类之后,在类之外定义函数。正如我在上面的评论中所说,如果您可以将私有成员/函数的声明放在一个内部头文件中,那就太好了,但是没有直接的支持。(你总是可以有一个
void*internal;
,但这只是一个解决办法。)@Shahbaz:所以,正如OP所问的,为什么没有人支持它?这不是Ancurio想知道的。他想知道为什么我们(有些人)一开始就不能把私人活动保密。你不能调用你不知道的函数。编译器需要知道它是私有的。因此,当其他人试图调用它时,它可以发出编译时警告…没有什么是真正的错误secret@nate_weldon这是真的,但是如果私有非虚拟函数没有首先在公共头文件(以及文档)中声明,那么没有人会尝试调用它。也许除了我自己。。。在这种情况下,警告(实际上不是一个错误吗?)是有意义的。请接受好友…因为好友会相互显示他们在标准3中的私有信息[注意:私有基类的成员可能无法作为继承的成员名访问,但可以直接访问。因为指针转换的规则(4.10)和显式强制转换(5.4),如果使用隐式转换,则从指向派生类的指针到指向不可访问基类的指针的转换可能格式不正确,但如果使用显式转换,则可能格式正确。呃,这似乎只是指出重载规则需要更改。@GManNickG是否考虑可见性而不选择不可访问的方法?C++它的工作方式有很好的理由。例如:我认为重载规则不需要考虑可访问性。它们可能只需要定义为只考虑在使用点之前声明的成员函数——因此,如果您的私有成员函数在类定义中,那么它将停止
a.F(1)
在客户端代码中编译,如果它仅添加在
A.cpp
中,则它不会影响客户端代码,但会影响.cpp。名称空间已经是这样工作的(如果添加更多重载,它们可能会被选中)。需要一些复杂性,例如,两阶段查找会发生什么。@SteveJessop当然可以做到,但我认为这将是一个相当大的变化。例如,当前类成员的作用域是整个类,甚至在声明类成员之前。我不认为复杂性是有保证的,因为它只是这是一个特殊的情况,即C++编译模型,已经有解决这个特殊情况的解决方案。我同意不需要改变,我只是在想象指令的混乱,我不认为这是令人困惑的。像以前一样在类中的任何位置都可见。通过这个假设的新机制添加的成员将具有不同的可见性,因为这是新机制的全部目的。我想你刚才描述了Python类=)@Neal:嗯……这就是
class A {
    void F(int i) {}
public:
    void F(unsigned i) {}
};

int main() {
    A a;
    a.F(1); // error, void A::F(int) is private
}
class A {
public:
    void F(unsigned i) {}
};

int main() {
    A a;
    a.F(1);
}

// add private F overload to A
void A::F(int i) {}
class A {
public:
    void F(unsigned i) {}
};

// add private F overload to A
void A::F(int i) {}

int main() {
    A a;
    a.F(1);
}
// A.h
class A {
public:
    void g() { f(1); }
    void f(unsigned);
};

// A_private_interface.h
class A;
void A::f(int);

// A.cpp
#include "A_private_interface.h"
#include "A.h"

void A::f(int) {}
void A::f(unsigned) {}

// main.cpp
#include "A.h"

int main() {
    A().g();
}