Форум программистов, компьютерный форум CyberForum.ru

Вывод списка объектов. Выводится только ссылка на первый элемент - C++

Восстановить пароль Регистрация
 
ВиталикТопКодер
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 11
14.01.2014, 02:41     Вывод списка объектов. Выводится только ссылка на первый элемент #1
Ребят, помогите вывести список из объектов класа "cic". Пробовал через итераторы как в мейне, но оно выводит только ссылку на первый елемент. Помогите, как правильно вывести список из объектов?

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
#include <iostream>
#include <list>
#include <iomanip>
using namespace std;
 
template <class T, class Allocator = allocator <T> >
class mylist : public list<T>{
public:
   
   mylist<T> () : list<T>(){}
   };
 
 
class cic {
public:
   int rad;
   int height;
   double sqr;
   double cap;
   cic(int,int,double,double);
   cic * temp;
};
 
cic::cic(int newRad,int newHeight,double newSqr, double newCap):
rad(newRad),
height(newHeight),
sqr(newSqr),
cap(newCap){
   
}
 
 
int main(){
   mylist<cic>::iterator it;
   mylist<cic>list;
   list.push_back(cic(8, 4, 312.23, 12425.23));
   for(it = list.begin(); it != list.end();++it){
      cout << *it;
   }
   
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.01.2014, 09:07     Вывод списка объектов. Выводится только ссылка на первый элемент #2
ВиталикТопКодер, Гм. А сколько он должен выводить, если у вас в списке только 1 элемент?
ВиталикТопКодер
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 11
14.01.2014, 10:31  [ТС]     Вывод списка объектов. Выводится только ссылка на первый элемент #3
Так я хочу что бы оно вывело именно его, а оно выводит ссылку на него. то есть я не могу просто написать
C++
1
cout << *it;
, говорит что бы я писал
C++
1
cout << &*it;
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.01.2014, 10:51     Вывод списка объектов. Выводится только ссылка на первый элемент #4
Цитата Сообщение от ВиталикТопКодер Посмотреть сообщение
cout << &*it;
Это не ссылка, это адрес.
Чтобы выводить в поток пользовательский тип нужно для этого типа реализовать operator<<.
ВиталикТопКодер
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 11
14.01.2014, 17:36  [ТС]     Вывод списка объектов. Выводится только ссылка на первый элемент #5
Получилось сделать вот так
C++
1
2
3
4
5
   for(it = list.begin(); it != list.end();++it){
      cout << it->rad << " " << it->height << " " << it->sqr << " " << it->cap << endl;
   }
   
}
но как сделать через перегрузку оператора вывода?
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
#include <iostream>
#include <list>
#include <iomanip>
using namespace std;
class cic;
 
template <class T, class Allocator = allocator <T> >
class mylist : public list<T>{
public:
   
   mylist<T> () : list<T>(){}
   friend ostream& operator<< (ostream& s, mylist<cic>);
};
 
[B]ostream &operator << (ostream & s,mylist<cic> list){
   mylist<cic>::iterator it;
   for(it = list.begin(); it != list.end();++it){
      s << *it
   }
 
   return s;
}[/B]
 
class cic {
public:
   int rad;
   int height;
   double sqr;
   double cap;
   cic(int,int,double,double);
   cic * temp;
};
 
cic::cic(int newRad,int newHeight,double newSqr, double newCap):
rad(newRad),
height(newHeight),
sqr(newSqr),
cap(newCap){
   
}
 
 
int main(){
   mylist<cic>::iterator it;
   mylist<cic>list;
   list.push_back(cic(8, 4, 312.23, 12425.23));
   list.push_back(cic(9, 3, 132.23, 95.23));
   for(it = list.begin(); it != list.end();++it){
      cout << it->rad << " " << it->height << " " << it->sqr << " " << it->cap << endl;
   }
   
}
попробовал так и не получается опять

Добавлено через 1 час 37 минут
Ребята, может кто помочь написать ф-цию перегрузки оператора << для вывода данного списка
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
#include <iostream>
#include <list>
#include <iomanip>
using namespace std;
class cic;
 
template <class T, class Allocator = allocator <T> >
class mylist : public list<T>{
public:
   
   mylist<T> () : list<T>(){}
   //friend ostream& operator<< (ostream& s, mylist<cic>);
   mylist * value;
};
 
ostream &operator << (ostream & s, mylist<cic>& list){
   
   // что тут писать?
 
   return s;
}
 
class cic {
public:
   int rad;
   int height;
   double sqr;
   double cap;
   cic(int,int,double,double);
};
 
cic::cic(int newRad,int newHeight,double newSqr, double newCap):
rad(newRad),
height(newHeight),
sqr(newSqr),
cap(newCap){
   
}
 
 
int main(){
   mylist<cic>::iterator it;
   mylist<cic>list;
   list.push_back(cic(8, 4, 312.23, 12425.23));
   list.push_back(cic(9, 3, 132.23, 95.23));
}
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.01.2014, 17:54     Вывод списка объектов. Выводится только ссылка на первый элемент #6
ВиталикТопКодер,
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
#include <iostream>
#include <list>
#include <iomanip>
 
class cic;
 
template <class T>
class mylist : public std::list<T>
{
public:
   
   mylist() {}
   mylist * value;
};
 
class cic {
public:
   int rad;
   int height;
   double sqr;
   double cap;
   cic(int,int,double,double);
};
 
std::ostream &operator << (std::ostream & s, const cic& c )
{
   return s << c.rad << " " << c.height; // etc
}
 
cic::cic(int newRad,int newHeight,double newSqr, double newCap):
rad(newRad),
height(newHeight),
sqr(newSqr),
cap(newCap){
   
}
 
 
int main(){
   mylist<cic>::iterator it;
   mylist<cic>list;
   list.push_back(cic(8, 4, 312.23, 12425.23));
   list.push_back(cic(9, 3, 132.23, 95.23));
   
   for( const auto& e : list )
   {
        std::cout << e << std::endl;
   }
}
http://ideone.com/7UH3kI
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 22:45     Вывод списка объектов. Выводится только ссылка на первый элемент
Еще ссылки по теме:

Выводится только первый символ строки C++
Выводится только последний элемент массива C++
Не выводится первый элемент стека C++

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

Или воспользуйтесь поиском по форуму:
ВиталикТопКодер
0 / 0 / 0
Регистрация: 14.01.2014
Сообщений: 11
14.01.2014, 22:45  [ТС]     Вывод списка объектов. Выводится только ссылка на первый элемент #7
cпасибо большое, очень помогли!

Добавлено через 1 час 20 минут
Ребята, а как теперь правильно отсортировать список со своим типом? .sort() не работает(. Нету разницы по какому из параметров сортировать.
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <list>
#include <fstream>
#include <iomanip>
using namespace std;
class circle;
 
template <class T>
class mylist : public list<T>
{
public:
   mylist() {};
   bool isEmpty(mylist<circle>);
 
};
 
class circle {
public:
   int rad;
   int height;
   double square;
   double capacity;
   double pi;
   double sqr();
   double cap();
   circle(int,int,double,double,double);
   circle(int,int,double);
 
 
};
 
std::ostream &operator << (std::ostream & s, const circle& c )
{
   
   return s << c.rad << setw(3) << c.height << "   " << c.square << "   " << c.capacity;
}
template<> bool mylist<circle>::isEmpty(mylist<circle> list){
   
   if(list.size() != 0)
      return false;
   else
      return true;
}
 
 
circle::circle(int a,int b,double p,double sqr,double cap):
rad(a),
height(b),
pi(p),
square(sqr),
capacity(cap)
{}
 
circle::circle(int a,int b,double p):
height(a),
rad(b),
pi(p){
   
}
 
double circle::sqr(){
   return 2 * pi * rad * (rad + height);
}
 
double circle::cap(){
   return pi * rad * rad * height;
}
 
int main(){
   double pi = 3.14;
   int height,radius;
   mylist<circle>::iterator it;
   mylist<circle>list;
   int choose;
   do{
      cout << endl;
      cout << "1.Add new object" << endl;
      cout << "2.Print list" << endl;
      cout << "3.Sort list" << endl;
      cout << "100. Exit" << endl;
      cin >> choose;
      switch (choose) {
         case 1: {
            cout << "Enter height and radius" << endl;
            cin >> height >> radius;
            circle circ(height,radius,pi);
            list.push_back(circle(height, radius, pi, circ.sqr(), circ.cap()));
            break;
         }
            
        case 2: {
            if(list.isEmpty(list)){
               cout << "All lists is empty ! " << endl;
            }
            else {
               for( const auto& e : list )
               {
                  cout << e << endl;
               }
               
            }
            break;
         }
         case 3:{
         list.sort() /// ??? тут выдает ошибку
        break;
        }
                default:{
            cout << "Not found menu " << endl;
            break;
         }
      }
   }while(choose != 100);
}
Добавлено через 42 минуты
попробовал перегрузить оператор <, но так же не хочет сравнивать типы. Помогите.
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
#include <list>
#include <fstream>
#include <iomanip>
using namespace std;
class circle;
 
template <class T>
class mylist : public list<T>
{
public:
   mylist() {};
   bool isEmpty(mylist<circle>);
 
};
 
class circle {
public:
   int rad;
   int height;
   double square;
   double capacity;
   double pi;
   double sqr();
   double cap();
   circle(int,int,double,double,double);
   circle(int,int,double);
   bool operator < (circle&);
};
 
ostream &operator << (ostream & s, const circle& c )
{
   
   return s << c.rad << setw(3) << c.height << "   " << c.square << "   " << c.capacity;
}
 
bool circle::operator < (circle & circ){
   return rad < circ.rad;
}
template<> bool mylist<circle>::isEmpty(mylist<circle> list){
   
   if(list.size() != 0)
      return false;
   else
      return true;
}
 
 
circle::circle(int a,int b,double p,double sqr,double cap):
rad(a),
height(b),
pi(p),
square(sqr),
capacity(cap)
{}
 
circle::circle(int a,int b,double p):
height(a),
rad(b),
pi(p){
   
}
 
double circle::sqr(){
   return 2 * pi * rad * (rad + height);
}
 
double circle::cap(){
   return pi * rad * rad * height;
}
 
int main(){
   double pi = 3.14;
   int height,radius;
   mylist<circle>::iterator it;
   mylist<circle>list;
   int choose;
   do{
      cout << endl;
      cout << "1.Add new object" << endl;
      cout << "2.Print list" << endl;
      cout << "3.Sort list" << endl;
      cout << "100. Exit" << endl;
      cin >> choose;
      switch (choose) {
         case 1: {
            cout << "Enter height and radius" << endl;
            cin >> height >> radius;
            circle circ(height,radius,pi);
            list.push_back(circle(height, radius, pi, circ.sqr(), circ.cap()));
            break;
         }
            
        case 2: {
            if(list.isEmpty(list)){
               cout << "All lists is empty ! " << endl;
            }
            else {
               for( const auto& e : list )
               {
                  cout << e << endl;
               }
               
            }
            break;
         }
         case 3:{
         list.sort() /// ??? тут выдает ошибку
        break;
        }
                default:{
            cout << "Not found menu " << endl;
            break;
         }
      }
   }while(choose != 100);
}
Добавлено через 1 час 12 минут
помогите, ребят, пишут что нужно реализовать перегрузку оператора < , сделал и все равно не работает. Подскажите хотя бы как правильно перегрузить

Добавлено через 1 час 15 минут
Ребят, ну помогите, сдавать завтра. Хотя бы какой-то совет
Yandex
Объявления
14.01.2014, 22:45     Вывод списка объектов. Выводится только ссылка на первый элемент
Ответ Создать тему
Опции темы

Текущее время: 04:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru