簡體   English   中英

Class 構造函數 arguments C++

[英]Class Constructor arguments C++

我正在為 ax 和 y 笛卡爾坐標系創建一對 class。 x 和 y 是雙精度數。 我需要有 3 個構造函數。

  1. 沒有 arguments,默認 x 和 y 為零。
  2. 一種論點將 x 賦值並將 y 默認為零。
  3. 一種參數默認 x 為零並分配 y。 我不確定我是否正確設置了 class。 我收到以下錯誤: pair1::pair1(double)pair1::pair1(double)不能重載。

我的 class:

class pair1
{
private:
    double x;
    double y;

public:
    pair1(){ x = 0.0, y = 0.0; }    
    pair1( double a ){ x = a; y =0.0; }
    pair1(double b){ x = 0.0;  y = b; }
};

1) 沒有 arguments,默認 x 和 y 為零。

這很容易

2) 一個論點指定 x 並將 y 默認為零。

3)一個arugeument默認x為零並分配y。

那是個問題。 當您只有一個參數時,您怎么知道要調用這兩個參數中的哪一個? 這就是你得到編譯錯誤的原因。

取而代之 - 使用默認構造函數(沒有參數的那個)、完整的構造函數(兩個都有),如果需要,使用SetX()SetY()分別設置 X 和 Y,並通過名稱來區分function。

class pair1
{
    private:
    double x;
    double y;

    public:
    pair1( double a=0.0, double b=0.0 ){ x = a; y =b; };
                     // default value 0.0 allows to only
                     // set x, and leave y to be the default,
                     // or leave them both default.
    void SetX(double a) { x=a;};
    void SetY(double b) { y=b;};
};

問題是編譯器沒有辦法區分

pair1(double a)

pair1(double b)

實際上,除了參數的名稱之外,它們是相同的。 例如:

pair1 myPair1(123.456); // Which constructor should be called?

這稱為模糊重載。

pair1( double a ){ x = a; y =0.0; }
pair1(double b){ x = 0.0;  y = b; }

這些是完全相同的構造函數。 不同的參數名稱沒有任何區別。 重載重要的是類型和類型的數量,以及它們的順序

我不確定除了 (0,0) 情況外,默認 arguments 是否有任何用途,但這樣的事情是否可行:

struct X
{
    double value;
    explicit X(double v) : value(v) {}
};

struct Y
{
    double value;
    explicit Y(double v) : value(v) {}
};

class pair1
{
    private:
        double x;
        double y;

    public:
        pair1() : x(0.0), y(0.0) {}
        explicit pair1(X a) : x(a.value), y(0.0) {}
        explicit pair1(Y b) : x(0.0), y(b.value) {}
        pair1(X a, Y b) : x(a.value), y(b.value) {}  // For completeness
        pair1(Y b, X a) : x(a.value), y(b.value) {}  // For super-completeness
        pair1(double a, double b) : x(a), y(b) {}
};

利用:

pair1 aPair(X(2.0));                 // default y
pair1 anotherPair(Y(4.875));         // default x
pair1 aThirdPair(X(1.0), Y(1.0));
pair1 aForthPair(Y(100.0), X(1.0));  // keyword arguments ;-)
pair1 quintus(23.0, 45.6);

暫無
暫無

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

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