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.