Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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++ 我可以使用'distance'作为我的类成员变量名吗?_C++ - Fatal编程技术网

C++ 我可以使用'distance'作为我的类成员变量名吗?

C++ 我可以使用'distance'作为我的类成员变量名吗?,c++,C++,可以这样定义一个类(忽略其实现): 但是,如果使用向量,则假定它隐式包含,其中包含std::distance,编译器如何区分std::distance和distance成员?(或者运行时会导致意外的崩溃?。比如说,函数get_result()依赖于distance成员值 #包括 使用名称空间std; MyEngine类{ 私人: 向量参数; 公众: 无效集参数(int*_参数,int _len); float get_result();//依赖于'distance'成员 浮动距离;//用户可以修

可以这样定义一个类(忽略其实现):

但是,如果使用
向量
,则假定它隐式包含
,其中包含
std::distance
编译器如何区分
std::distance
distance
成员?(或者运行时会导致意外的崩溃?
。比如说,函数
get_result()
依赖于
distance
成员值

#包括
使用名称空间std;
MyEngine类{
私人:
向量参数;
公众:
无效集参数(int*_参数,int _len);
float get_result();//依赖于'distance'成员
浮动距离;//用户可以修改此值
};

更新

正如人们所提到的,
使用名称空间std
是不好的做法;然而,仍然有人使用命名空间std使用
编写代码,如果我们与他们合作,使用他们的代码,是否有任何具体的例子证明
使用命名空间std
的不好,特别是严重的运行错误?这才是我真正的目的

答案是,按类型区分这两种距离。让我们试试这个片段:

#包括
#包括
#包括
#包括
使用名称空间std;
MyEngine类{
私人:
向量参数;
float*distance;//用户可以修改此值
内伦;
公众:
无效设置();
};
void MyEngine::setup()
{
len=100;
距离=(浮点*)malloc(sizeof(浮点)*len);

对于(int i=0;i函数
distance
的类型与成员
distance
的类型不同,因此编译器会根据类型来计算

你甚至可以有一个函数
distance(…)
。只要参数不同,它们就有不同的类型,编译器会计算出来

还请注意,您不应该使用
使用命名空间std
,因为这也会激怒人类读者


在您更新的示例中,编译器确实很混乱。在本例中,您可以通过将
int num=std::distance(…)更改为
int num=std::distance(…)来指定要使用
distance
函数函数
distance
的类型与成员
distance
的类型不同,因此编译器会根据类型来计算

你甚至可以有一个函数
distance(…)
。只要参数不同,它们就有不同的类型,编译器会计算出来

还请注意,您不应该使用
使用命名空间std
,因为这也会激怒人类读者


在您更新的示例中,编译器确实很混乱。在本例中,您可以通过将
int num=std::distance(…)更改为
int num=std::distance(…)来指定要使用
distance
函数;

一个是
MyEngine::distance
,另一个是
std::distance
。它们是不同的名称。这就是作用域的全部意义

只有当您使用非限定名称
distance
并让编译器来解决它时,才会出现问题,但如果这不起作用,则可能是因为所选名称的类型与您的用法不匹配,因此您的程序无法编译


如果您确实将内容放入了
std
中,那么名称可能会以潜在的不可诊断的方式冲突,这可能会导致崩溃,并且根据标准具有未定义的行为。

好的,一个是
MyEngine::distance
,另一个是
std::distance
。它们是不同的名称。这就是作用域的全部要点

只有当您使用非限定名称
distance
并让编译器来解决它时,才会出现问题,但如果这不起作用,则可能是因为所选名称的类型与您的用法不匹配,因此您的程序无法编译


如果您确实在
std
中输入了内容,那么名称可能会以潜在的不可诊断的方式冲突,这可能会导致崩溃,并且按照标准具有未定义的行为。

请参见。@AdrianMole谢谢,
distance
在参考页的注释中提到请参见。@AdrianMole谢谢,
distance
在注释i中提到在参考页上,即使类型相同,也不会有问题。@Henk我用一个新的测试代码更新了我的问题即使类型相同,也不会有问题。@Henk我用一个新的测试代码更新了我的问题。请给出一个好的简短示例,可以重现“根据标准的未定义行为”?@HaxtraZ
#include
名称空间std{void foo(){}
你能给出一个好的、简短的例子来重现“根据标准未定义的行为”@HaxtraZ
#include
名称空间std{void foo(){}
class MyEngine {
private:
    int*  params;
    int   param_len;
public:
    void  set_params(int* _params, int _len);
    float  get_result(); // relies on `distance` member
    float  distance;   // people can modify this
};
main.cpp:25:23: error: called object type 'float *' is not a function or function pointer
    int num = distance(params.begin(), params.end());
              ~~~~~~~~^
1 error generated.