c++ - 我可以使用“距离”作为我的类成员变量名吗?
问题描述
可以定义这样的类(忽略它的实现):
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
};
但是,如果 using vector
,假设它隐含包含<iterator>
which contains 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
,如果我们与他们合作,使用他们的代码,是否有任何实例可以证明 的坏处,特别是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(...);
推荐阅读
- javascript - 未找到 npx,以为它在 PATH 中
- android - AAPT:错误:找不到资源样式/zxing_CaptureTheme(aka.....app:style/zxing_CaptureTheme)
- android - 是否可以使 Android WebView 缩放像 Firefox / Chrome 缩放一样工作?
- javascript - “pm2 serve build PORT”回显 404 未找到
- excel - Excel VBA - 如何在复制信息后自动删除过滤器
- azure - Azure AD:如何使令牌具有“hasgroups”声明?
- php - Laravel php artisan migrate 什么都不做
- python - 使用 Tweepy 更新了 Twitter 直接消息 API
- php - 如何在 PHP 中执行多个操作并且只将标头发送回客户端一次?
- python - 当我使用 Thrift 将 C++ 中的映射序列化到磁盘,然后使用 Python 对其进行反序列化时,我没有返回相同的对象