Почему я получаю эту ошибку «Конструктор не определен»? - PullRequest
0 голосов
/ 22 октября 2019

В Java появляется эта ошибка:

Error: The constructor MyComplex(MyComplex) is undefined

Код Java:

public class MyComplex {
    int realPart, imaginaryPart;
    public MyComplex(){
    }
    public MyComplex(int realPart, int imaginaryPart) {
        this.realPart = realPart;
        this.imaginaryPart = imaginaryPart;
    }
    public void setRealPart(int realPart) {
        this.realPart = realPart;
    }
    public String toString() {
        return realPart + " + " + imaginaryPart +"i";
   }
}
public class MyComplexTester {
    public static void main(String[] args) {
        MyComplex a = new MyComplex(20, 50);
        MyComplex b = new MyComplex(a);        //Error happens here
        b.setRealPart(4);
        System.out.println(b);
    }
}

Код работает нормально, если я использую

MyComplex b = a;

Но я могуне изменяйте код в методе main, так как это домашнее задание по разработке класса для запуска данного метода.

Ответы [ 5 ]

3 голосов
/ 22 октября 2019

Объяснение

У вас нет конструктора, который принимает другой MyComplex ( конструктор копирования ). Вы только создали конструкторы, которые принимают:

  • Без аргументов, new MyComplex()
  • Два int аргумента, new MyComplex(5, 2)

Решение

Вам нужно явно определить конструкторы, которые вы хотите использовать. Java не генерирует такой конструктор для вас. Например:

public MyComplex(MyComplex other) {
    realPart = other.realPart;
    imaginaryPart = other.imaginaryPart;
}

Тогда это также будет работать.


Примечания

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

Например, прямо сейчас ваш конструктор по умолчанию new MyComplex() приведет к комплексному значению 0 + 0i. Но это легко можно заметить, так как ваш код явно не указывает на это.

С пересылкой намерение намного яснее:

public MyComplex() {
    this(0, 0);
}

public MyComplex(MyComplex other) {
    this(other.realPart, other.imaginaryPart);
}

Тогда оба будут просто пересылать явный конструктор, который принимаетдва значения int.

Обратите внимание, что единственный конструктор Java, автоматически генерируемый для вас, - это тривиальный конструктор по умолчанию. То есть public MyComplex() { } (без аргументов - ничего не делает). И только если вы сами не написали конструктор.

1 голос
/ 22 октября 2019

Поскольку нет конструктора, объявленного с MyComplex в качестве аргумента. Вам нужно объявить следующий конструктор: -

 public MyComplex(MyComplex mycomplex) {
    this.realPart = mycomplex.realPart;
    this.imaginaryPart = mycomplex.imaginaryPart;
}
1 голос
/ 22 октября 2019

у вас должен быть перегруженный конструктор, который принимает объект типа MyComplex, чтобы получить эту работу.

ниже ваш обновленный класс

public class MyComplex {
    int realPart, imaginaryPart;
    public MyComplex(){
    }
    public MyComplex(int realPart, int imaginaryPart) {
        this.realPart = realPart;
        this.imaginaryPart = imaginaryPart;
    }

   public MyComplex(MyComplex mycomplex) {//this is the constructor you need
        this.realPart = mycomplex.realPart;
        this.imaginaryPart = mycomplex.imaginaryPart;
    }

    public void setRealPart(int realPart) {
        this.realPart = realPart;
    }
    public String toString() {
        return realPart + " + " + imaginaryPart +"i";
   }
}
1 голос
/ 22 октября 2019

Вы должны создать соответствующий (скопировать) конструктор.
Итак:

public MyComplex(MyComplex a){
  realPart = a.realPart;
  imaginaryPart = a.imaginaryPart;
}
0 голосов
/ 22 октября 2019

Потому что в строке ниже

MyComplex b = new MyComplex (a);

вы передаете тип MyComplex, но в классе MyComplex вы определиликонструктор с одним параметром, тип которого int. пожалуйста, исправьте ваш параметр передачи.

...