Аргументы конструктора класса C ++ - PullRequest
2 голосов
/ 30 июня 2011

Я создаю класс pair1 для ax и y декартовой системы координат.х и у двойники.Мне нужно иметь 3 конструктора.

  1. Без аргументов, по умолчанию x и y равны нулю.
  2. Один аргумент присваивает x и по умолчанию y ноль.
  3. Один arugeumentпо умолчанию x равен нулю и присваивает y.Я не уверен, правильно ли я настраиваю класс.Я получаю следующую ошибку: pair1::pair1(double) и pair1::pair1(double) не могут быть перегружены.

Мой класс:

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; }
};

Ответы [ 4 ]

5 голосов
/ 30 июня 2011

1) без аргументов, по умолчанию x и y равны нулю.

Это просто

2) один аргумент присваивает x, а по умолчанию y равен нулю.

3) один округ по умолчанию х равен нулю и присваивает y.

Это проблема.Как вы знаете, когда у вас есть только один параметр, какой из двух должен быть вызван?Вот почему вы получаете ошибку компиляции.

Вместо этого - используйте конструктор по умолчанию (тот, у которого нет параметров), полный конструктор (тот, у которого есть оба), если необходимо, и SetX() и SetY() для установкиX и Y отдельно, и различать по названию функции.

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;};
};
2 голосов
/ 30 июня 2011

Проблема в том, что компилятор не может различить

pair1(double a)

и

pair1(double b)

Действительно, это одно и то же, за исключением имени параметра. Например:

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

Это называется неоднозначная перегрузка.

1 голос
/ 30 июня 2011
pair1( double a ){ x = a; y =0.0; }
pair1(double b){ x = 0.0;  y = b; }

Это точно такой же конструктор. Различное имя параметра не имеет никакого значения. Все, что имеет значение для перегрузки , это тип (ы) и число типов и их порядок .

0 голосов
/ 30 июня 2011

Я не уверен, что наличие аргументов по умолчанию, за исключением случая (0,0), имеет смысл, но что-то подобное может работать:

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);
...