#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;
вместо недопустимого carc1[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 проблемы:
- Массивы переменной длины (VLA) не допускаются в стандартном C . Они необязательно разрешены в стандартном C и поддерживаются некоторыми компиляторами C в качестве расширения.
- У вас не может быть массива объектов без конструктора по умолчанию (если вы не инициализируете его полностью).
Предполагая, что вы не хотите изменять класс (кроме вставки 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);
это нонсенс.