微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我可以使用 `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::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编写代码,如果我们与他们合作,使用他们的代码,是否有任何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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?