首页 > 解决方案 > 我可以使用“距离”作为我的类成员变量名吗?

问题描述

可以定义这样的类(忽略它的实现):

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::distancedistance成员?(或者运行时会导致意外崩溃?)。比如说,函数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与其类型区分开来。

标签: c++

解决方案


该函数distance的类型与成员不同distance,因此编译器通过类型来计算。

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

另请注意,您不应使用using namespace std,因为这也会激怒人类读者。

在您更新的示例中,编译器确实很困惑。在这种情况下,您可以指定要使用该distance功能,方法是将其更改为int num = std::distance(...);


推荐阅读