簡體   English   中英

我可以使用“距離”作為我的 class 成員變量名稱嗎?

[英]Can I use `distance` as my class member variable name?

可以像這樣定義 class (忽略它的實現):

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成員? (或者運行時會導致意外崩潰?) 比如說,function 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

function distance的類型與成員distance不同,因此編譯器通過類型計算出來。

你甚至可以有一個 function distance(...) 只要參數不同,它們就具有不同的類型,編譯器會計算出來。

另請注意,您不應使用using namespace std ,因為這也會激怒人類讀者。

在您更新的示例中,編譯器確實很困惑。 在這種情況下,您可以指定要使用distance function,方法是將其更改為int num = std::distance(...);

好吧,一個是MyEngine::distance ,另一個是std::distance 他們是不同的名字。 這是scopes的全部內容。

如果您使用不合格的名稱distance並讓編譯器找出它,那么只有一個問題,但如果這不起作用,那將是因為選擇的類型與您的用法不匹配,所以您的程序不會編譯。

如果您確實將內容放入std中,那么名稱可能會以潛在的無法診斷的方式發生沖突,這可能導致崩潰,並且根據標准具有未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM