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

массив указателей на void* - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
max.taranukhin
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 4
02.09.2012, 16:20     массив указателей на void* #1
Здравствуйте. Сейчас пытаюсь решить задачу из книги Брюса Эккеля "Философия С++", I том. В одном из упражнений требуется передать в конструктор массив из указателей на объекты и размер этого массива. Пробовал написать что-то в духе:
C++
1
2
3
4
5
6
7
Stack::Stack(void **data, int count)
{
   for (int i = 0; i < count; ++i)
       push(data[i]);                    // push функция данного класса, которая добавляет данные в стек
}
 
void Stack::push(void * data) {...}
Но у меня совершенно ничего не получается. Подскажите в чем ошибка.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.09.2012, 16:48     массив указателей на void* #2
покажи весь код
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2012, 16:57     массив указателей на void* #3
как-то подозрительно все выглядит. класс называется Stack. подозреваю, что он будет реализовывать стэк (или?). тогда ему в конструктор логично задать кусок памяти, где он может развернуться, а он сразу начинает что-то куда-то пушить. может, конструктор просто должен запомнить где-то у себя атрибуты этой рабочей памяти, установить stack pointer на вершину и быть готовым? там, похоже, не должно быть никаких объектов, просто помять под указатели?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.09.2012, 17:09     массив указателей на void* #4
Да и вообще, странная философия какая-то, смешивать ООП и указатель на void. Страуструп не рекомендовал использовать void* в C++ коде :-)
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2012, 17:26     массив указателей на void* #5
Цитата Сообщение от Герц Посмотреть сообщение
Да и вообще, странная философия какая-то, смешивать ООП и указатель на void. Страуструп не рекомендовал использовать void* в C++ коде :-)
страуструп был давно, и страуструп не решал все задачи. иногда использование таких указателей упрощает решение. главное, чтобы все под контролем было.
max.taranukhin
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 4
02.09.2012, 17:39  [ТС]     массив указателей на void* #6
Цитата Сообщение от Jupiter Посмотреть сообщение
покажи весь код
Задание звучит так:
Создайте новую версию класса Stack из главы 6 с конструктором по умолчанию и вторым конструктором, в аргументах которого передается массив указателей на объекты и размер этого массива. Конструктор должен перебирать элементы массива и заносить каждый указатель в стек. Протестируйте класс с массивом объектов string.

Stack.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef STACK_H
#define STACK_H
 
class Stack
{
        struct Link
        {
                void* data;
                Link* next;
                Link(void* dat, Link* nxt);
                ~Link();
        }* head;
public:
        Stack();                              // конструктор по умолчанию
        Stack(void *arr, int count);    // конструктор принемающий массив указателей и размер этого массива
        ~Stack();
        void push(void* dat);
        void* peek();
        void* pop();
};
 
#endif
Stack.cpp
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 "Stack.h"
using namespace std;
 
Stack::Link::Link(void *dat, Link *nxt)
{
        data = dat;
        next = nxt;
}
 
Stack::Link::~Link() { }
 
Stack::Stack() { head = 0; }
 
Stack::Stack(void *arr, int count)
{
        for(int i = 0; i < count; ++i)
                push(arr[i]);
}
 
void Stack::push(void *dat)
{
        head = new Link(dat, head);
}
 
void* Stack::peek()
{
        if (head == 0) return 0;
        return head->data;
}
 
void* Stack::pop()
{
        if (head == 0) return 0;
        void * result = head->data;
        Link *oldHead = head;
        head = head->next;
        delete oldHead;
        return result;
}
 
Stack::~Stack() { }
Добавлено через 2 минуты
Цитата Сообщение от novi4ok Посмотреть сообщение
как-то подозрительно все выглядит. класс называется Stack. подозреваю, что он будет реализовывать стэк (или?). тогда ему в конструктор логично задать кусок памяти, где он может развернуться, а он сразу начинает что-то куда-то пушить. может, конструктор просто должен запомнить где-то у себя атрибуты этой рабочей памяти, установить stack pointer на вершину и быть готовым? там, похоже, не должно быть никаких объектов, просто помять под указатели?
Цитата Сообщение от Герц Посмотреть сообщение
Да и вообще, странная философия какая-то, смешивать ООП и указатель на void. Страуструп не рекомендовал использовать void* в C++ коде :-)
Прошу вас, не воспринемайте эту задачу с точки зрения практики. Это всего лишь учебная задача и не более
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
02.09.2012, 19:21     массив указателей на void* #7
C++
1
2
3
4
5
Stack::Stack(void **data, int count)
{
   for (int i = 0; i < count; ++i)
       push(data[i]);                    // push функция данного класса, которая добавляет данные в стек
}
Может я чего-то не понимаю, но каким образом это должно работать? Во-первых, data - двумерный массив, а значит, как минимум, должна быть перегрузка []. Во-вторых, data[i] - арифметика на указателях вида data+i*sizeof(data), а data - void, а значит арифметика такая "не попрет". Используй либо приведение типа к Stack, допустим :
push(Stack(data)[i]); // если есть перегрузка []
Или задай как-нибудь размер самой структуры и используй именно арифметику вида : data+i*sizeof(MYCLASS), вместо data[i]
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.09.2012, 00:11     массив указателей на void* #8
Цитата Сообщение от max.taranukhin Посмотреть сообщение
Задание звучит так:
Создайте новую версию класса Stack из главы 6 с конструктором по умолчанию и вторым конструктором, в аргументах которого передается массив указателей на объекты и размер этого массива. Конструктор должен перебирать элементы массива и заносить каждый указатель в стек. Протестируйте класс с массивом объектов string.
я по коду иначе задание понял. т.е. все что я написал раньше - фтопку! и, естественно, ничем не могу поучаствовать, не имея понятия, что такое за класс Stack в главе 6.
max.taranukhin
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 4
06.09.2012, 00:33  [ТС]     массив указателей на void* #9
Цитата Сообщение от novi4ok Посмотреть сообщение
я по коду иначе задание понял. т.е. все что я написал раньше - фтопку! и, естественно, ничем не могу поучаствовать, не имея понятия, что такое за класс Stack в главе 6.
Ну код Stack из главы 6 такой же как я писал выше за исключением того что отсутствует конструктор с параметрами
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
06.09.2012, 00:54     массив указателей на void* #10
может я че т не понимаю только я в задании слово void не увидел))

там говорится что для примера создать массив ссылок на string

т.е должно выглядеть как то так:

C++
1
2
3
4
5
6
7
8
9
10
std::string mystr1 = "Alex";
std::string mystr2 = "Ilya";
std::string mystr3 = "Friend";
std::string mystr4 = "Dima";
 
std::vector<std::string*> arrStr;
arrStr.push_back(&mystr1);
arrStr.push_back(&mystr2);
arrStr.push_back(&mystr3);
arrStr.push_back(&mystr4);
ну и все далее ты arrStr передаеш как первый параметр функции - массив указателей на string
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2012, 00:59     массив указателей на void*
Еще ссылки по теме:

Арифметика указателей (указатель на void*) C++
Задача с использованием функции типа void и указателей, как параметров функций C++
Использование указателей типа VOID C++

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

Или воспользуйтесь поиском по форуму:
max.taranukhin
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 4
06.09.2012, 00:59  [ТС]     массив указателей на void* #11
Цитата Сообщение от Dark2012 Посмотреть сообщение
может я че т не понимаю только я в задании слово void не увидел))
Я понял что конструктор должен принемать массив указателей на произвольные типы. Без void мне показалось не как не обойтись. Возможно я не правильно понял задание.
Yandex
Объявления
06.09.2012, 00:59     массив указателей на void*
Ответ Создать тему
Опции темы

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