Re: Вектор об'єктів
ну то берете першу букву та й порівнюєте з першою буквою інших елементів
Може не прокатить, бо є кольори що починаються однаковими буквами(Blue-Black,Green-Grey)
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Вектор об'єктів
ну то берете першу букву та й порівнюєте з першою буквою інших елементів
Може не прокатить, бо є кольори що починаються однаковими буквами(Blue-Black,Green-Grey)
Може не прокатить, бо є кольори що починаються на одинакові букви(Blue-Black,Green - Grey)
const int n = 5;
vector<Car*> list(n);
vector<Car>::iterator it;
.............................
...................................
.....якийсь код...................
for(it = list.begin(); it != list.end(); ++it)
{
}
У цьому випадку компілятор там де знак "=" і знак "!=" матюкається. Допоможіть виправити
Для початку - розберіться, як взагалі сортувати різні елементи (підказка: про ітератори вам дали погану пораду).
Потім - як саме порівнювати різні об'єкти, зокрема, рядки. І тільки потім починайте сортувати.
І ніколи не кажіть "компілятор матюкається", якщо, звісно, цей компілятор не зроблений 30 років тому і розміром з тодішні дискети. Всі компілятори, розроблені пізніше, не матюкаються, а повідомляють про помилку, і часто досить детально, щоб її виправити. Якщо не розумієте - копіюйте повідомлення компілятора сюди і викладайте свої думки з цього приводу.
#include <iostream>
#include <conio.h>
#include <vector>
#include <iterator>
#include <string>
using namespace std;
class Car
{
private:
int year;
string color;
string brand;
string typefuel;
public:
Car(int year,string color,string brand,string typefuel)
{
this->brand = brand;
this->color = color;
this->typefuel = typefuel;
this->year = year;
}
friend ostream& operator<< (ostream& stream, const Car& c);
~Car(){}
};
ostream& operator<< (std::ostream& stream, const Car& c)
{
stream << "Color " << c.color << " | Yaer " << c.year << " | Type fuel " << c.typefuel << " | Brand " << c.brand << endl;
return stream;
}
void main()
{
int year;
string color;
string brand;
string typefuel;
const int n = 2;
vector<Car*> list(n);
for(int i = 0; i < n; i++)
{
cout << "Enter color: ";
cin >> color;
cout << "Enter year: ";
cin >> year;
cout << "Enter brand: ";
cin >> brand;
cout << "Enter type fuel: ";
cin >> typefuel;
Car *asd = new Car(year,color,brand,typefuel);
list.push_back(asd);
}
vector<Car*>::iterator it;
for(it = list.begin(); it != list.end(); ++it)
{
cout << *it;
}
_getch();
}
Чому після перегрузки оператора, мені виводить сміття?
До перевантаження оператора ця програма не могла виводити сміття, бо не знала, як зробити cout << *it; (не важливо, зі сміттям чи ні).
Чому дорівнює *list.begin(), як гадаєте?
Це вказівник на нульовий елемент вектора
Не зовсім так, хоча може ви й маєте на увазі те, що треба, не будемо уточнювати, я не питав "що це", я питав, "чому він дорівнює".
Ну і схоже я все ж дав вам погану пораду - так, вказівниками сортувати швидше, але вас поки що це буде плутати. Загальне правило: читаність коду зазвичай важливіша за оптимальність, бо якщо ви можете розібрати, як він працює, то можете і оптимізувати, але якщо ви не можете розібрати, то нічого з ним вже не зробите. Якщо вказівники вас збивають з пантелику, ставте там просто об'єкти.
#include <iostream>
#include <conio.h>
#include <vector>
#include <iterator>
#include <string>
using namespace std;
class Car
{
private:
int year;
string color;
string brand;
string typefuel;
public:
Car()
{}
Car(int year,string color,string brand,string typefuel)
{
this->brand = brand;
this->color = color;
this->typefuel = typefuel;
this->year = year;
}
int Year()
{
return year;
}
string Color()
{
return color;
}
string Typefuel()
{
return typefuel;
}
string Brand()
{
return brand;
}
friend ostream& operator<< (ostream& stream, const Car& c);
bool operator==(const Car& c) const;
~Car(){}
};
ostream& operator<< (ostream& stream, const Car& c)
{
stream << "Color " << c.color << " | Year " << c.year << " | Type fuel " << c.typefuel << " | Brand " << c.brand << endl;
return stream;
}
bool Car::operator==(const Car & c) const
{
if (this->Color==c.Color)
return true;
}
void main()
{
int year;
string color;
string brand;
string typefuel;
const int n = 3;
vector<Car> list(n);
for(int i = 0; i < n; i++)
{
cout << "Enter color: ";
cin >> color;
cout << "Enter year: ";
cin >> year;
cout << "Enter brand: ";
cin >> brand;
cout << "Enter type fuel: ";
cin >> typefuel;
Car asd(year,color,brand,typefuel);
list.push_back(asd);
}
vector<Car>::iterator it;
for(it = list.begin(); it != list.end(); ++it)
{
cout << *it;
}
cout << "...:::Sort by color:::....\n";
for(it = list.begin(); it != list.end(); ++it)
{
cout << *it->Color;
for(vector<Car>::iterator at = list.begin; at != list.end();at++)
{
if(*it->Color == *at->Color)
{
сout << *at->Color;
}
}
}
_getch();
}
Я не розумію, чому воно не працює.Тут напевно проблема з перегрузкою, і з конструктором по замовчуванню.
Допоможіть будь-ласка виправити.
Компілятор пише: error C2276: '*' : illegal operation on bound member function expression
Ну так прочитайте: '*' - некоректна операція на функції-члені. Ви не написали, в якому рядку це стається, але якщо припустити, що *it->Color - то чого ви очікуєте від операції '*', застосованої до функції Color, що є членом об'єкту, на який вказує it?
То як мені його виправити? Я прибирав "*", тоді мені пише: error C3867: 'Car::Color': function call missing argument list; use '&Car::Color' to create a pointer to member
З звичайними функціями - так, а з методами класу - не дуже
Ну то уявіть собі, що it->Color - це звичайна функція. Чого не вистачає?