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

Операция new. Указатель на указатель - C++

Восстановить пароль Регистрация
 
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
17.04.2013, 14:39     Операция new. Указатель на указатель #1
Всем aloha. Проблема в следующем: в своей програмке я создаю указатель на указатель
C++
1
person** ptrP
затем инициализирую его массивом указателей на объекты класса person
C++
1
person** ptrP = new person*[12]
далее присваиваю каждому указателю адрес инициализированного объекта person, но ничего не получается по какой то причине. не работает даже вызов функции display_person(), для любого из указателей, хотя даже пустому указателю на объект person конструктор должен был задать значение полей first_name и last_name "пусто". Однако этого не происходит. Подскажите пожалуйста в чем тут дело, уже всю голову сломал. Другие способы реализации данной программы меня не интересуют, хотел сделать именно вот так, но почему то не получается, вроде всё делаю правильно ведь. Конструктор перегрузил, присваивание тоже, в чем же проблема, не пашут именно указатели. Вот код:
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
//---------------------------------------------------------------------------
 
#include <iostream>
#include <set>
#include <algorithm>
#include <string>
using namespace std;
 
//---------------------------------------------------------------------------
class person
{
 private:
  string first_name;
  string last_name;
  long phone_number;
 public:
  person (): first_name("emty"), last_name("emty"), phone_number(0L)
  {}
  person( string fn, string ln, long pn ) : first_name (fn), last_name(ln),
  phone_number(pn)
  {}
  person(person& pers)
  {
   first_name = pers.first_name;
   last_name = pers.last_name;
   phone_number = pers.phone_number;
  }
  friend bool operator < ( const person&, const person& );
  friend bool operator == ( const person&, const person&);
  person& operator = ( const person& );
  void display_person() const
  {
        cout << "\n Person's name: " << first_name
        << "\n Person's lastname: " << last_name
        <<"\n Person's phonenumber: " << phone_number << endl;
  }
};
//---------------------------------------------------------------------------
bool operator < (const person& p1, const person& p2)
{
 if(p1.last_name == p2.last_name)
        return (p1.first_name < p2.first_name ) ? true : false;
 return (p1.last_name < p2.last_name) ? true : false;
}
//---------------------------------------------------------------------------
bool operator == (const person& p1, const person& p2)
{
 return ( p1.first_name == p2.first_name &&
  p1.last_name == p2.last_name )? true : false;
}
//---------------------------------------------------------------------------
person &person :: operator = ( const person& p1 )
{
 first_name = p1.first_name;
 last_name = p1.last_name;
 phone_number = p1.phone_number;
 return *this;
}
class displayPerson
{
 public:
  void operator()(const person* ptrP) const
  {
   {ptrP->display_person();}
  }
};
//---------------------------------------------------------------------------
class comparePerson
{
 public:
  bool operator()(const person* ptrP1, const person* ptrP2)
  {
        return *ptrP1 < *ptrP2;
  }
};
//---------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
 multiset<person*, comparePerson()> setPers;
 person** ptrP = new person*[12];
 *ptrP[0] = person("Jack", "Sallywan", 9031917602);
 *ptrP[1] = person("Forest","Gump",9152120632);
 *ptrP[2] = person("Malzahar", "The Prophet", 66666666);
 *ptrP[3] = person("Eugeni", "Shteine", 9164241233);
 *ptrP[4] = person("Dominic","Inferno", 99966699);
 *ptrP[5] = person("Lucas", "Kayne", 21345232);
 *ptrP[6] = person("Bob", "Marley", 12333123);
 *ptrP[7] = person("James","Sunderland", 32323222);
 *ptrP[8] = person("Forest","Gump", 4545343);
 *ptrP[9] = person("Tom","Feedle", 80908780);
 *ptrP[10] = person("Death","Decay", 999999999);
 *ptrP[11] = person("Sylvana","Windrunner", 7878787877);
 
 for( int j = 0; j < 12; j++ )
        setPers.insert(ptrP[j]);
 
 for_each(setPers.begin(), setPers.end(),displayPerson());
 system("PAUSE");
 
        return 0;
}
//---------------------------------------------------------------------------
Добавлено через 16 минут
Я идиот. Вопрос решен) и указатель на указатель тут совсем не нужен, можно использовать обычный массив указателей на person с передачей в алгоритм for_each() адресов объектов.
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
//---------------------------------------------------------------------------
 
#include <iostream>
#include <set>
#include <algorithm>
#include <string>
using namespace std;
 
//---------------------------------------------------------------------------
class person
{
 private:
  string first_name;
  string last_name;
  long phone_number;
 public:
  person (): first_name("emty"), last_name("emty"), phone_number(0L)
  {}
  person( string fn, string ln, long pn ) : first_name (fn), last_name(ln),
  phone_number(pn)
  {}
  person(person& pers)
  {
   first_name = pers.first_name;
   last_name = pers.last_name;
   phone_number = pers.phone_number;
  }
  friend bool operator < ( const person&, const person& );
  friend bool operator == ( const person&, const person&);
  person& operator = ( const person& );
  void display_person() const
  {
        cout << "\n Person's name: " << first_name
        << "\n Person's lastname: " << last_name
        <<"\n Person's phonenumber: " << phone_number << endl;
  }
};
//---------------------------------------------------------------------------
bool operator < (const person& p1, const person& p2)
{
 if(p1.last_name == p2.last_name)
        return (p1.first_name < p2.first_name ) ? true : false;
 return (p1.last_name < p2.last_name) ? true : false;
}
//---------------------------------------------------------------------------
bool operator == (const person& p1, const person& p2)
{
 return ( p1.first_name == p2.first_name &&
  p1.last_name == p2.last_name )? true : false;
}
//---------------------------------------------------------------------------
person &person :: operator = ( const person& p1 )
{
 first_name = p1.first_name;
 last_name = p1.last_name;
 phone_number = p1.phone_number;
 return *this;
}
class displayPerson
{
 public:
  void operator()(const person* ptrP) const
  {
   {ptrP->display_person();}
  }
};
//---------------------------------------------------------------------------
class comparePerson
{
 public:
  bool operator()(const person* ptrP1, const person* ptrP2)
  {
        return *ptrP1 < *ptrP2;
  }
};
//---------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
 multiset<person*, comparePerson()> setPers;
 person ptrP[12];
 ptrP[0] = person("Jack", "Sallywan", 9031917602);
 ptrP[1] = person("Forest","Gump",9152120632);
 ptrP[2] = person("Malzahar", "The Prophet", 66666666);
 ptrP[3] = person("Eugeni", "Shteine", 9164241233);
 ptrP[4] = person("Dominic","Inferno", 99966699);
 ptrP[5] = person("Lucas", "Kayne", 21345232);
 ptrP[6] = person("Bob", "Marley", 12333123);
 ptrP[7] = person("James","Sunderland", 32323222);
 ptrP[8] = person("Forest","Gump", 4545343);
 ptrP[9] = person("Tom","Feedle", 80908780);
 ptrP[10] = person("Death","Decay", 999999999);
 ptrP[11] = person("Sylvana","Windrunner", 7878787877);
 
 
 for( int j = 0; j < 12; j++ )
        setPers.insert(&ptrP[j]);
 
 
 
 
 
 for_each(setPers.begin(), setPers.end(),displayPerson());
 system("PAUSE");
 
        return 0;
}
//---------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2013, 14:39     Операция new. Указатель на указатель
Посмотрите здесь:

указатель на указатель или присваивание объекта C++
Указатель или ссылка на указатель. В чем разница? C++
C++ Преобразовать указатель одного типа в указатель другого.
Передать в неуправляемую функцию указатель на указатель C++
C++ Указатель this и операция разрешения области действия
Расскажите, как здесь работает указатель на указатель? C++
Почему указатель на указатель объявляется как float **A; C++
C++ Указатель на указатель и Нарушение прав доступа

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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