kinderu Ответов: 2

Ищете некоторую помощь с java-кодом


У меня есть следующий код на C++, и я хочу написать его на Java

#include <iostream>
#include <cstring>
using namespace std;

class MyClass
{
private:
    char *firstName;
    char *secondName;
public:
    MyClass(const char *firstName, const char *secondName)
    {
        if (this->firstName != NULL)
            this->firstName = NULL;
        this->firstName = new char[strlen(firstName)+1];
        strcpy(this->firstName, firstName);

        if (this->secondName != NULL)
            this->secondName = NULL;
        this->secondName = new char[strlen(secondName)+1];
        strcpy(this->secondName, secondName);
    }
    ~MyClass()
    {
        if (firstName != NULL)
            delete firstName;
        firstName = NULL;

        if (secondName != NULL)
            delete secondName;
        secondName = NULL;
    }
    char *getFirstName()
    {
        return firstName;
    }
    char *getSecondName()
    {
        return secondName;
    }
    friend ostream& operator<< (ostream& out, MyClass &obj);
    friend istream& operator>> (istream& in, MyClass &obj);
};

ostream &operator<< (ostream& out, MyClass &obj)
{
    out << "\n First Name: " << obj.firstName << endl;
    out << "\n Second Name: " << obj.secondName << endl;

    return out;
}

istream& operator>> (istream& in, MyClass &obj)
{
    char aux[20];
    if (obj.firstName != NULL)
        delete[] obj.firstName;
    cout << "\n First Name: ";
    in >> aux;
    obj.firstName = new char[strlen(aux)+1];
    strcpy(obj.firstName, aux);

    if (obj.secondName != NULL)
        delete[] obj.secondName;
    cout << "\n Second Name: ";
    in >> aux;
    obj.secondName = new char[strlen(aux)+1];
    strcpy(obj.secondName, aux);

    return in;
}

int main()
{
    MyClass obj("Dragu", "Stelian");
    cout << "\n First Name: " << obj.getFirstName() << endl;
    cout << "\n Second Name: " << obj.getSecondName() << endl;
    cin >> obj;
    cout << obj;
    return 0;
}


Я попытался написать приведенный выше код на Java

package myclass;
import java.util.Scanner;

class FirstClass
{
    private char firstName[];
    private char secondName[];
    public FirstClass(char firstName[], char secondName[])
    {
        this.firstName = firstName;
        this.secondName = secondName;
    }

    public char getFirstName()
    {
        return firstName;
    }

    public char getSecondName()
    {
        return secondName;
    }
};

public class MyClass
{
    public static void main(String[] args)
    {
        FirstClass obj = new FirstClass("Dragu", "Stelian");
        Scanner input = new Scanner(System.in);
        System.out.print("Enter First Name: ");
        obj.firstName = input.nextLine();
        
        System.out.print("Enter Second Name: ");
        obj.secondName = input.nextLine();
        
        System.out.println("Name is: " +obj.firstName + " " +obj.secondName);
    }
    
}


Что я уже пробовал:

Теперь, есть некоторые аспекты в Java.
1. Никаких указателей в Java, поэтому я использую переменные типа char.
2. в Java нет деструктора.
3. Методы getfirstname(), getSecondName() функция возвращает или возвращает массив типа char.
Итак, я получаю ошибку, когда пытаюсь вернуть массив char.
4. В C++ для ввода данных с клавиатуры и их отображения я использую перегрузку потоковых операторов.
В Java нет перегрузки операторов.
Я думаю, что это проще, если я использую строковые данные.

Пожалуйста, помогите мне!

2 Ответов

Рейтинг:
12

Jochen Arndt

Откуда вы взяли этот (плохой) код C++ и даже скомпилировали обе версии?

Гораздо лучше будет использовать std::string вместо массивов символов. Затем он может быть преобразован в Java с помощью Java String класс. Поэтому измените свои члены на этот тип в вашем классе Java.

Поскольку вы устанавливаете строки существующих объектов, а члены являются закрытыми, вы также должны предоставить setFirstName() и setLastName() функции (в версиях C++ и Java) или сделать строковые члены общедоступными (что было бы плохим стилем).

[РЕДАКТИРОВАТЬ]
С помощью std::string в версии C++ избегается самостоятельная обработка буферов и сокращается исходный код: выделение и удаление не требуется, а созданный по умолчанию деструктор будет вызывать деструкторы строковых членов, так что нет необходимости реализовывать деструктор. Хотя иногда для этого могут быть причины, обычно это не обязательно делать со строками. Просто будь проще.

Несколько заметок, когда, используя свой собственный C++ для выделения памяти :


  • Нет никакой необходимости проверять наличие NULL указатели в конструкторе. Значения там не определены до тех пор, пока не будут установлены.
  • Нет никакой необходимости проверять наличие NULL указатели с delete.
  • Нет никакой необходимости устанавливать указатели окончательно на NULL в деструкторе.

Вышесказанное объясняет, почему я писал о плохом коде. Обратите также внимание, что функции get должны быть const и возвращать символы const:
// Allocated string versions
const char *getFirstName() const { return firstName; }
// std::string version
const char *getFirstName() const { return firstName.c_str(); }

Java - это язык сбора мусора, так что нет необходимости в деструкторе или освобождении объектов. Хотя можно было бы создать свои собственные объекты на основе символов для хранения строк, это еще более бесполезно, чем с C++ (по тем же причинам, и это довольно редко встречается с Java).

Потоковые операции не могут быть просто преобразованы в Java. Но я думаю, что ваше решение подходит так, что я не предоставил решение.

Но вы можете создать функцию, которая выводит значения.
[/РЕДАКТИРОВАТЬ]


kinderu

Оба кодекса составлены мной(ради практики).
Да, я скомпилировал обе версии, код C++ работает нормально, код Java-нет.
Как вы видели в предыдущем посте, я сказал, что было бы проще использовать строковые данные.

Хорошо, я изменил тип участников.

package myclass;
import java.util.Scanner;

class FirstClass
{
    private String firstName;
    private String secondName;
    public FirstClass(String firstName, String secondName)
    {
        this.firstName = firstName;
        this.secondName = secondName;
    }

    public String getFirstName()
    {
        return firstName;
    }
    
    public void setFirstName(String firstName)
    {
       this.firstName = firstName; 
    }

    public String getSecondName()
    {
        return secondName;
    }
    
    public void setSecondName(String secondName)
    {
       this.secondName = secondName;
    }
};

public class MyClass
{
    public static void main(String[] args)
    {
        FirstClass obj = new FirstClass("Dragu", "Stelian");
        Scanner input = new Scanner(System.in);
        System.out.print("Enter First Name: ");
        obj.setFirstName = input.nextLine();
        
        System.out.print("Enter Second Name: ");
        obj.secondName = input.nextLine();
        
        System.out.println("Name is: " +obj.firstName + " " +obj.secondName);
    } 
}



Поэтому я получаю ошибку в строках Параметр obj.имя = ввод.строки();
Параметр obj.secondName = вход.строки();
это нормально, потому что члены firstName и secondName являются частными.


Я просто хочу ввести firstName и secondName с клавиатуры, как в коде C++, где я использую перегрузку оператора потока.

Jochen Arndt

Должен признаться, что мне не хватало друга с версией C++.

Чтобы избежать ошибки Java используйте новые функции:

obj.setFirstName(input.nextLine());

И вы также должны использовать функции get при печати на последней строке, как в версии C++.

kinderu

import java.util.Scanner;

class FirstClass
{
private String firstName;
private String secondName;
public FirstClass(String firstName, String secondName)
{
this.firstName = firstName;
this.secondName = secondName;
}

public String getFirstName()
{
return firstName;
}

public void setFirstName()
{
Scanner in = new Scanner(System.in);
firstName = in.nextLine();
}

public String getSecondName()
{
return secondName;
}

public void setSecondName()
{
Scanner in = new Scanner(System.in);
secondName = in.nextLine();
}
};

public class MyClass
{
public static void main(String[] args)
{
FirstClass obj = new FirstClass("Dragu", "Stelian");
System.out.println("Name is: " +obj.getFirstName() + " " +obj.getSecondName());

System.out.print("Enter First Name: ");
obj.setFirstName();

System.out.print("Enter Second Name: ");
obj.setSecondName();

System.out.println("Name is: " +obj.getFirstName() + " " +obj.getSecondName());
} 
}


И все же у меня есть вопрос: почему так плохо использовать char-массивы ?

Jochen Arndt

Я обновлю свое решение с помощью некоторой информации, отвечающей и на этот вопрос.

kinderu

Спасибо, что уделили мне время, Йохен Арндт!

Member 14314943

Напишите java-программу для чтения и записи студенческих объектов с записями фиксированной длины и
поля, разделенные символом “|”. Реализуйте методы pack ( ), unpack ( ), modify ( ) и search ( ) с использованием RRN

Member 14314943

Напишите java-программу для чтения и записи студенческих объектов с записями фиксированной длины и
поля, разделенные символом “|”. Реализуйте методы pack ( ), unpack ( ), modify ( ) и search ( ).

Рейтинг:
1

CPallini

Во-первых, вы должны написать "разумный" C++ код.

#include <iostream>
#include <string>
using namespace std;

class Person
{
  string firstname, secondname;
public:
  Person( const char * firstname, const char * secondname ) : firstname(firstname), secondname(secondname)
  {
  }
  string getFirstName() const { return firstname; }
  string getSecondName() const { return secondname; }

  friend istream& operator>> (istream& in, Person & p);
};

ostream& operator<< (ostream& out, const Person & p)
{
  out << "\n First Name: " << p.getFirstName() << "\n";
  out << "\n Second Name: " << p.getSecondName() << endl;
  return out;
}

istream& operator>> (istream& in, Person & p)
{
  in >> p.firstname >> p.secondname;
  return in;
}

int main()
{
  Person dragu("Dragu", "Stelian");
  cout << "\n First Name: " << dragu.getFirstName() << endl;
  cout << "\n Second Name: " << dragu.getSecondName() << endl;

  cout << "\nPlease enter person't first and second name: ";
  cin >> dragu;
  cout << dragu;
}


Тогда вам следует подумать о том, чтобы переехать C++ код для Java это расценивается как преступление против человечности.


Richard MacCutchan

Посмотрите на дату вопроса.

CPallini

О Боже, я немного опоздала. Спасибо, что указали на это.