Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
1

Класс и vector

15.04.2013, 23:19. Показов 1457. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
всем доброго времени суток,задача состоит в том что бы данные классов хранились в векторе,что я и пытался сделать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <algorithm>
#include <vector>
 
 
using namespace std;
 
#define n 40
 
class book{
public:
    book(char name_of_book=NULL,char author=NULL,int numb_of_authors=0,int year=0,int numb_of_pages=0);
    //void input();
    //void show();
    ~book();
private:
    char my_name_of_book[n],my_author[n];
    int my_numb_of_authors,my_year,my_numb_of_pages;
};
 
 
book::book(char name_of_book,char author,int numb_of_authors,int year,int numb_of_pages)
{
my_name_of_book[n]=name_of_book;
my_author[n]=author;
my_numb_of_authors=numb_of_authors;
my_year=year;
my_numb_of_pages=numb_of_pages;
 
 
}
 
book ::~book(){
    cout<<"Деструктор\n";
}
 
int main(){
    setlocale(0,"");
    vector<book> books;
    books.push_back(book("NAme", "Vasilii", 2, 1991, 200));//Ошибка book::book: ни одна из 2 перегрузок не может преобразовать все типы аргументов
    books.push_back(book("Titans", "Artem", 1, 2010, 483));//Ошибка book::book: ни одна из 2 перегрузок не может преобразовать все типы аргументов
    sort(books.begin(), books.end());
    system("pause");
    return 0;
}
но вот почему не добавляет не пойму.
и как потом вывести на экран данные которые мы занесли в vector
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2013, 23:19
Ответы с готовыми решениями:

Базовый класс Complex и производный класс Vector
Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в...

Класс Vector
Помогите молю. Нужно реализовать класс вектор как класс шаблон. Перегрузить операторы ввода-...

Класс содержащий vector
Вот я написал класс с использованием vector #include &lt;vector&gt; #include &lt;iostream&gt; using...

Задания на класс vector
Помогите, пожалуйста, с задачей. Нужно добавить в вектор нечетные целые числа от -3 до 3. Удалить...

15
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
15.04.2013, 23:23 2
C++
1
books.push_back(book("NAme", "Vasilii", 2, 1991, 200));
это бред...
добавлять в контейнер vector надо объект класса book, а не конструктор непонятно над чем... сконструируйте объект сперва, а потом уже пихайте в vector
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
15.04.2013, 23:29 3
Это и есть конструирование объекта.
0
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
15.04.2013, 23:40 4
вы видимо меня не поняли)

гляжу на ваше "конструирование"...

C++
1
book::book(char name_of_book,char author,int numb_of_authors,int year,int numb_of_pages)
что у нас идёт первым аргументом конструктора?
тип char - 1 байт... вторым- тип char 1 байт...
а зачем вы туда передаёте
"NAme", "Vasilii"
это в один байт не влезет...
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.04.2013, 23:42 5
Ошибка в том, что конструктор принимает тип char в качестве первого и второго параметра, а ты передаешь const char *, т.е. указатели на строки.
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
15.04.2013, 23:45  [ТС] 6
разобрался,спасибо,но остался вопрос.
и как потом вывести на консоль данные которые мы занесли в vector
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
15.04.2013, 23:47 7
И еще push_back требует объект book в качестве параметра, а конструктор не возвращает объект book. Он вообще ничего не возвращает в принципе.
0
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
15.04.2013, 23:51 8
Цитата Сообщение от palva Посмотреть сообщение
И еще push_back требует объект book в качестве параметра, а конструктор не возвращает объект book. Он вообще ничего не возвращает в принципе.
вы не правы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
 
class A
{
    public:
       A() {std::cout<<"Constructor"<<std::endl;}
};
 
int main()
{
   std::vector<A> B; 
   B.push_back(A());
   std::cout<<B.size();
   return 0;
}
это работает и конструирует таки объект для для B
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
15.04.2013, 23:55 9
Да, вижу, что не прав.
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
16.04.2013, 00:08  [ТС] 10
повторюсь как на консоль вывести информацию которую мы занесли в обьект вектора
потому что
C++
1
2
3
4
5
6
char book::show()
{
    return my_name_of_book[n];
}
for (int i = 0; i < (int)books.size(); i++) 
        cerr << books[i].show() << endl;
нормального нечего не выводит.
0
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
16.04.2013, 00:24 11
Vlad_,
тут вообще какая-то чепуха у вас написана

C++
1
2
3
4
char book::show()
{
    return my_name_of_book[n];
}
это некая функция, из класса book не принимающая аргументов...

и далее не с того не сего вдруг продолжение
C++
1
2
for (int i = 0; i < (int)books.size(); i++) 
        cerr << books[i].show() << endl;
та функция закрыта.... к чему это вообще относится

насчёт основного вопроса - вектор всё же контейнер произвольного доступа, поэтому там сходу можно два варианта обхода реализовать - через индекс и через итератор
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
16.04.2013, 01:43  [ТС] 12
через #include <iterator>
C++
1
copy(books.begin(), books.end(), ostream_iterator<book>(cout, "\n"));
Ошибка 1 error C2679: бинарный <<: не найден оператор, принимающий правый операнд типа "book" (или приемлемое преобразование отсутствует)

Добавлено через 38 минут
опять таки хожу по кругу.
добавил
C++
1
2
3
4
5
char getAuthor()const {return my_author[n];}
    friend ostream &operator<<(ostream &stream, const book &book_obj) {
        stream << book_obj.getAuthor() << ", "; 
        return stream;
    }
и
C++
1
2
ostream_iterator<book> out_it (cout,", ");
    copy ( books.begin(), books.end(), out_it );
в итоге опять выводит не понятно что
0
390 / 365 / 111
Регистрация: 03.02.2013
Сообщений: 1,120
16.04.2013, 02:06 13
Vlad_,
через #include <iterator>
C++
1
copy(books.begin(), books.end(), ostream_iterator<book>(cout, "\n"));
я так не помню, но поступил бы так -
C++
1
2
   for(std::vector<book>::const_iterator it=books.begin(); it!=books.end(); ++it)
        std::cout<<(*it)<<std::endl;
тут понятно что для book должен быть перегружен оперетор << на ostream& или вместо (*it) определить it->showmethod в классе book
а ещё лучше начать с нуля и заменить std::cout на ostream )
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
16.04.2013, 02:09  [ТС] 14
разобрался,скажу это жесть вот готовый код,который работает,может кому-то понадобиться,можете сравнить с оригиналом и понять что нужно было делать)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
#include <iterator>
 
using namespace std;
 
#define n 40
 
class book{
public:
    book(char* name_of_book="",char* author="",int numb_of_authors=0,int year=0,int numb_of_pages=0);
    friend ostream &operator<<(ostream &stream, const book &book_obj) {
        stream << book_obj.my_name_of_book << ", "<<book_obj.my_author<< ", "<<book_obj.my_numb_of_authors<< ", "<<book_obj.my_year<< ", "<<book_obj.my_numb_of_pages<<endl ; 
        return stream;
    }
    ~book();
private:
    char* my_name_of_book;
    char* my_author;
    int my_numb_of_authors,my_year,my_numb_of_pages;
};
 
 
 
book::book(char* name_of_book,char* author,int numb_of_authors,int year,int numb_of_pages)
{
    my_name_of_book=name_of_book;
    my_author=author;
    my_numb_of_authors=numb_of_authors;
    my_year=year;
    my_numb_of_pages=numb_of_pages;
}
 
book ::~book(){
    //cout<<"Деструктор\n";
}
 
int main(){
    setlocale(0,"");
    vector<book> books;
    books.push_back(book("NAme", "Vasilii", 2, 1991, 200));
    books.push_back(book("Titans", "Artem", 1, 2010, 483));
    books.push_back(book("Voina i Mir", "Lev", 1, 1910, 1423));
    cout << "Сoдержимое вектора :\n" ;
    ostream_iterator<book> out_it (cout,"");
    copy ( books.begin(), books.end(), out_it );
    cout<<endl;
    system("pause");
    return 0;
}
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
16.04.2013, 07:39 15
C++
1
2
3
4
char * book::show()
{
    return my_name_of_book;
}
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
16.04.2013, 16:42  [ТС] 16
вот реализация ручного ввода,и количество книг по желанию пользователя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <vector>
#include <iterator>
 
using namespace std;
 
#define razm 40
 
class book{
public:
    book(){char* name_of_book="";char* author="";int numb_of_authors=0;int year=0;int numb_of_pages=0;};
    friend ostream &operator<<(ostream &stream, const book &book_obj) {
        stream << book_obj.my_name_of_book << ", "<<book_obj.my_author<< ", "<<book_obj.my_numb_of_authors<< ", "<<book_obj.my_year<< ", "<<book_obj.my_numb_of_pages<<endl ; 
        return stream;
    }
    ~book();
    friend book input();
    friend void show_books(vector<book> &books);
private:
    char my_name_of_book[razm];
    char my_author[razm];
    int my_numb_of_authors,my_year,my_numb_of_pages;
};
 
 
book input()
{
book tmp;
cout<<"Имя книги ";
cin>>tmp.my_name_of_book;
cout<<"Автор ";
cin>>tmp.my_author;
cout<<"Количество авторов ";
cin>>tmp.my_numb_of_authors;
cout<<"Год издания ";
cin>>tmp.my_year;
cout<<"Количество страниц в книге ";
cin>>tmp.my_numb_of_pages;
return tmp;
}
 
void show_books(vector<book> &s_books)
{
if (s_books.empty())
{
    cout<<"Нет книг!!!"; return;
}
cout<<"Каталог книг"<<endl;
    ostream_iterator<book> out_it(cout,"");
    copy(s_books.begin(),s_books.end(),out_it);
    
}
 
book ::~book(){
    //cout<<"Деструктор\n";
}
 
int main(){
    setlocale(0,"");
    vector<book> books;
    int n;
    cout<<"Введи количество книг\n";
    cin>>n;
    for (int i=0;i<n;i++){
    books.push_back(input());
    }
    cout << "\nСoдержимое вектора :\n" ;
    show_books(books);
    system("pause");
    return 0;
}
0
16.04.2013, 16:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2013, 16:42
Помогаю со студенческими работами здесь

Класс Vector и оператор new
Есть класс CItem Есть тип: typedef std::vector &lt;CItem&gt; ItemVector; typedef std::vector...

Шаблонный класс vector
Всем привет. Помогите создать шаблонный класс vector и массив который хранит значения...

Создать класс Vector 2D
Создать класс Vector для работы с векторами на плоскости, содержащий следующие члены класса: 1. ...

vector (шаблонный класс)
Нужно создать простенький шаблонный класс вектор Подскажите пожалуйста , как написать запись...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru