如何解决我可以使用 `distance` 作为我的类成员变量名吗?
这样定义一个类就可以了(忽略它的实现):
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
};
然而,如果使用vector
,假设它隐含包含<iterator>
,其中包含std::distance
,编译器如何区分std::distance
和distance
成员? (还是会在运行时导致意外崩溃?)。比如说,函数 get_result()
依赖于 distance
成员值。
#include <vector>
using namespace std;
class MyEngine {
private:
vector<int> params;
public:
void set_params(int* _params,int _len);
float get_result(); // relies on `distance` member
float distance; // people can modify this
};
更新
正如人们所提到的,using namespace std
是不好的做法;但是,仍然有人用using namespace std
编写代码,如果我们与他们合作,使用他们的代码,是否有任何concreate示例可以证明using namespace std
的坏处,特别是严重的运行错误?这才是我真正的目的。
有一个答案,说按类型区分这两个distance
。让我们试试这个片段:
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iterator>
using namespace std;
class MyEngine {
private:
vector<int> params;
float* distance; // people can modify this
int len;
public:
void setup();
};
void MyEngine::setup()
{
len = 100;
distance = (float*)malloc(sizeof(float)*len);
for(int i=0; i<len; i++) {
distance[0] = len - i;
params.push_back(len-i);
}
int num = distance(params.begin(),params.end());
printf("distance is: %d\n",num);
}
int main(){
MyEngine engine;
int len = 10;
engine.setup();
return 0;
}
哪个,会导致编译错误说:
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.
证明它无法区分两个 distance
和它们的类型。
解决方法
函数 distance
的类型与成员 distance
的类型不同,因此编译器会根据类型进行判断。
您甚至可以拥有一个函数 distance(...)
。只要参数不同,它们的类型就不同,编译器会计算出来。
另请注意,您不应该使用 using namespace std
,因为这也会激怒人类读者。
在您更新的示例中,编译器确实很困惑。在这种情况下,您可以指定要使用 distance
函数,方法是将其更改为 int num = std::distance(...);
嗯,一个是 MyEngine::distance
,另一个是 std::distance
。他们是不同的名字。这就是范围的全部意义。
如果您使用非限定名称 distance
并让编译器自行解决,那只会有问题,但如果这不起作用,那将是因为所选名称的类型不正确匹配您的用法,因此您的程序将无法编译。
如果您曾经将东西放在 std
中,那么名称可能以潜在的无法诊断的方式发生冲突,这可能导致崩溃,并且具有未定义的行为标准。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。