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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
#1

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

17.04.2013, 14:39. Просмотров 192. Ответов 0
Метки нет (Все метки)

Всем 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;
}
//---------------------------------------------------------------------------
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2013, 14:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Операция new. Указатель на указатель (C++):

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Указатель this и операция разрешения области действия - C++
Помогите, пожалуйста..возник вопрос при наследовании классов Вот фрагмент кода, конструктор класса Lector, который наследует некоторые...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Функция, принимающая указатель и число байт и выделяющая память под указатель - C++
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и число байт и выделяющую память под...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2013, 14:39
Привет! Вот еще темы с ответами:

Функция принимает указатель на void и возвращает указатель на int - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Указатель на указатель, функции для создания новых массивов? - C++
Всем привет! У меня в коде есть несколько новых массивов, чтобы не повторяться я создам функцию которая будет выделять память под новые...

Объяснить работу функции, возвращающей указатель на указатель на char - C++
Добрый день! Сможете объяснить что означает запись char **InputFile(int &amp;strings);? Почему именно двойное **? Буду очень благодарна...

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru