Как инициализировать массив объектов с пользовательскими значениями и принимать входные данные от пользователя?

#c #class #constructor

#c #класс #конструктор

Вопрос:

 #include <iostream>
using namespace std;

class car{

string owner;
string car_num;
string issue_date;

car(string o, string cn, string id)
{
    owner = o;
    car_num  = cn;
    issue_date = id;
}

void getInfo()
{
    cout << "Car's Owner's Name : " << owner << endl;
    cout << "Cars' Number : " << car_num << endl;
    cout << "Car's Issue Date : " << issue_date << endl;
}

};

int main()
{
    
    int n;
    cout << "Enter total number of cars stored in your garage : n";
    cin >> n;
    car c1[n]; //incomplete code due to the issue


    return 0;
}
 

Здесь я хочу получить от пользователя общее количество автомобилей. А также хотите получить свойства car от пользователя с помощью цикла. Но как я могу это сделать при использовании конструктора?

Комментарии:

1. Используйте std::vector<car> cars; вместо недопустимого car c1[n]; .

Ответ №1:

Мой совет — не злоупотреблять конструктором. Он должен был строиться и действительно должен только строиться. В вашем случае вам даже не нужен конструктор. Вместо этого добавьте новую функцию для инициализации. Традиционно используется оператор >>, который часто является внешней функцией.
Что касается цикла…

car c1 [n]; // неполный код из-за проблемы

не является законным C (хотя это разрешено в C и во многих компиляторах, которые также являются компиляторами C)
, Лучше использовать vector. So…

     vector<car> c1(n);
    for (autoamp; c : c1) 
       cin >> c;
 

Продвинутый метод заключается в использовании итератора istream, который позволит вам использовать алгоритмы, такие как std::copy , вызывая оператор ввода для каждого элемента вектора. Однако это действительно не требуется, просто «приятность»

Ответ №2:

car c1 [n]; // неполный код из-за проблемы

На самом деле, у вас здесь 2 проблемы:

  1. Массивы переменной длины (VLA) не допускаются в стандартном C . Они необязательно разрешены в стандартном C и поддерживаются некоторыми компиляторами C в качестве расширения.
  2. У вас не может быть массива объектов без конструктора по умолчанию (если вы не инициализируете его полностью).

Предполагая, что вы не хотите изменять класс (кроме вставки public: после элементов данных), современное решение должно использовать std::vector :

     std::vector<car> c;

    //incomplete part
    for(int i = 0; i < n; i  ){
        std::string owner, car_num, issue_date;
        //TODO: get the strings from the user here ...
        c.emplace_back(owner, car_num, issue_date);
        }
 

Комментарии:

1. @rifatibn только что заметил и исправил важную опечатку в исходном коде. Назначение не требовалось!

Ответ №3:

Вместо этого используйте массив указателей. например.

 car* c1[n];

//incomplete part
for(int i = 0; i < n; i  ){
    //take input and process
    c1[i] = new car(//put processed inputs here);
    }
 

PS: Я чувствую, что где-то допустил ошибку, но сейчас не могу ее проверить. Если это не сработает, оставьте комментарий здесь.

Комментарии:

1. Ваше решение в порядке, немного старомодно, но разумно. Однако массив является VLA, и поэтому недопустим C . Это будет работать на многих компиляторах, но это не совместимый код.

2. Это простая версия. Лично я бы предпочел поместить их в связанный список.

3. Если вы ищете easy, я бы использовал unique_ptr , ваш код также протекает 🙂 Тем не менее, код старой школы часто был таким.

Ответ №4:

Вы можете использовать цикл с std::cin, например for(int i=0;i<n; i){std::cin<<num;} . ‘n’, который я упомянул в коде, также может быть назначен std::cin

 int n;
std::cin>>n;
car* cars=new car[n];
for(int i=0;i<n;  i)
{
   std::getline(cars[i].owner,std::cin);
   // and something other you'd like to do, like to test its validity
}
 

Комментарии:

1. Я не уверен, что ваш ответ поможет. Я не уверен, почему getline поможет? (Может быть, я что-то упускаю)?

Ответ №5:

 #include <iostream>
using namespace std;

class car{
public:
string owner;
string car_num;
string issue_date;

void cars(string o, string cn, string id)
{
    owner = o;
    car_num  = cn;
    issue_date = id;
    getInfo();
}

void getInfo()
{
    cout << "Car's Owner's Name : " << owner << endl;
    cout << "Cars' Number : " << car_num << endl;
    cout << "Car's Issue Date : " << issue_date << endl;
}

};

int main()
{
    
    int n;
    string a,b,c;
    cout << "Enter total number of cars stored in your garage : n";
    cin >> n;
    car cas[n]; //incomplete code due to the issue
    for(int i=0;i<n;  i)
    {
     cout<<"value1:";
     cin>>a;
     cout<<"value2:";
     cin>>b;
     cout<<"value3:";
     cin>>c;
     cas[i].cars(a,b,c);
    }

    return 0;
}
 

Комментарии:

1. Это не решает проблему массива объектов без ctor по умолчанию. Кроме того, cas[i].cars(a,b,c); это нонсенс.