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

что означает подобное объявление: TObject *Massiv[]; - C++

Восстановить пароль Регистрация
 
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
21.12.2011, 13:36     что означает подобное объявление: TObject *Massiv[]; #1
т.е. хотелось бы понять, как лимитируется массив указателей. Он безразмерный. Вроде бы память не выделяется динамически. Значит статически резервирует? Но я во время выполнения программы могу задавать разное количество элементов в массиве.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2011, 13:36     что означает подобное объявление: TObject *Massiv[];
Посмотрите здесь:

C++ есть ли в с++ что - нибудь подобное, и покажите как ...
C++ Что означает if(!p) ?
C++ Что означает while (1) {. . . }
Что означает %d C++
Int x(4); Что за объявление? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кирил
1 / 1 / 0
Регистрация: 13.09.2011
Сообщений: 7
21.12.2011, 13:56     что означает подобное объявление: TObject *Massiv[]; #2
Мы указываем, что хотим в дальнейшем создать массив указателей
C++
1
TObject *Massiv[]
И данной строкой создаем указатель на начало массива ...
Т.е. мы сразу не резервируем кучу места, а всего лишь указываем начало.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.12.2011, 14:11     что означает подобное объявление: TObject *Massiv[]; #3
Андрей2011, так писать нельзя, компилятор заругается на неполный тип. Объявляем массив - пишем Type arr[size], size - константный и обязательный. Объявляем указатель - пишем Type *ptr, при этом создаётся переменная, которая можех хранить адрес другой переменной типа Type. Память необходимо выделять вручную, с помощью malloc(c)/new(c++)/new[](c++).

Добавлено через 2 минуты
Кирил, данной строкой мы создаём массив указателей на TObject, и размер его обязательно нужно указать.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
21.12.2011, 15:02  [ТС]     что означает подобное объявление: TObject *Massiv[]; #4
ну как это нельзя? еще как можно!
По этому и спрашиваю))
Правда это у меня в классе так вот можно.
Вот по поводу указываем на начало...и не резервируем место. Получается вот какая штука. Допустим мне нужен массив указателей. Я делаю вот как:
TObject *Massiv[];
или альтернатива:
C++
1
2
TObject *p_FThisObject;
 p_FThisObject = new TObject[10]; // - как то так...не знаю.
Вобщем хочется через new объявить чтоб потом можно было сделать так:
C++
1
2
Massiv[0] =&Object; //так вот работает
Massiv[1] =&Object;
или
C++
1
2
p_FThisObject[0] =&Object; //так вот нет.
p_FThisObject[1] =&Object;
Вобщем если рассматривать 1й вариант т.е. без точного указателя размера, то...вроде все работает, но не понятно почему и на сколько это критично
А второй способ не могу довести до ума. Как быть?

Добавлено через 9 минут
Мы указываем, что хотим в дальнейшем создать массив указателей - вот не соглашусь я. вкедь дальше я могу написать вот что:
C++
1
2
TObject *Massiv[];
Massiv[0] =&Object;
т.е выходит что 1м шагом я не собираюсь в дальнейшем создавать а именно создаю.
а 2м шагом определяю первый элемент массива. или, возможно 2м шагом создаю массив из одного элемента? тогда что будет если добавить:
Massiv[1] =&Object; - пересоздается массив с 2я элементами уже? тогда как память выделяется?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.12.2011, 15:22     что означает подобное объявление: TObject *Massiv[]; #5
Андрей2011, класс слишком большой? Покажете?

Добавлено через 7 минут
Ну или урежьте так, чтобы компилировалось и чтобы код был минимальным.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
21.12.2011, 15:34  [ТС]     что означает подобное объявление: TObject *Massiv[]; #6
да легко.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template<class TObject>
class NewStack
{
public:
    NewStack(){};
    void AddObject(TObject &Object)
    {
 
//p_FThisObject = new TObject[10]; 
 
Massiv[0] =&Object;
Massiv[1] =&Object;
Massiv[0]->Print();
    }
    int KolObject;
    TObject *Object_;
    TObject *Massiv[];
    ~NewStack() 
    { 
        //delete[] p_FThisObject;
    }; 
};
Добавлено через 10 минут
Мне надо как-то так сделать:
C++
1
2
 TObject *p_FThisObject = new TObject[10];
*p_FThisObject[0]=&Object;
- т.е. если вот так задаю *p_FThisObject[0]=Object; //без ссылки
то все работает. но мне с сылкой нада и чтоб массив. Не получается(((
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.12.2011, 15:38     что означает подобное объявление: TObject *Massiv[]; #7
Андрей2011, экспериментально было выяснено, что так делать не надо)) При попытке добавить достаточно большое количество объектов в массив стек (не ваш стек, программный) разрушается. Использовать надо динамическое выделение памяти.
Вот только я так и не понял, что у вас не получается... Создать динамический массив указателей? Тогда так:
C++
1
TObject **ptrarr = new TObject *[size];
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
21.12.2011, 16:12  [ТС]     что означает подобное объявление: TObject *Massiv[]; #8
Да. Только что я пришел к подобному выводу. Такой массив но работает корректно у меня. Большое спасибо, уважаемый silent_1991. Вы мне очень помогли.

Добавлено через 17 минут
Блин. А вот еще вот застрял тут:
Пишу значит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<class TObject>
class NewStack
{
public:
    NewStack(){KolObject=0;};
    void AddObject(TObject &Object)
    {
 
ptrarr = new TObject *[10];
ptrarr[KolObject] =&Object;
 
KolObject++;
    }
    int KolObject;
    TObject **ptrarr;
    ~NewStack() 
    { 
        //delete[] p_FThisObject;
    }; 
};
и хочу вызвать объекты:
C++
1
2
3
4
    for(short i=0; i<NewStackPixel.KolObject; ++i)
    {
NewStackPixel.ptrarr[i]->Print();
    }
- ругается! Как корректно обработать 2й указатель?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.12.2011, 16:20     что означает подобное объявление: TObject *Massiv[]; #9
Андрей2011, во-первых, вы зачем память выделяете при каждом вызове метода добавления элемента? Вам надо выделять память под некоторое начальное количество элементов в конструкторе, отдельно хранить актуальный размер массива и в случае, если в функции добавления очередной элемент не помещается в массив, выделять память под новый массив большего размера, копировать в него все текущие элементы, а затем новый. А лучше и правильнее воспользоваться std::vector.

Добавлено через 4 минуты
Андрей2011, вообще, у вас какая задача? Написать класс "Стек"? Просто то, что вы пишите - какой-то странный стек. Скажем так, для стека нафиг не нужен двумерный массив (или массив указателей).
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
21.12.2011, 16:22  [ТС]     что означает подобное объявление: TObject *Massiv[]; #10
ну это я поправлю разумеется. Этож стек у меня. А почему вектор лучше? Для него надо спец. библиотеки и наверно работает медленнее раз там доп ф-и в нем. ну и привычней такие вот массивы пользовать. Да и с вектором думаю была бы подобная проблема с этим самым двойным указателем..

Добавлено через 2 минуты
ну вот задача сделать стек хранить там объекты наследники основного базового как бы класса. пришел к выводу что нужен указатель на загружаемый объект. тогда корректно отрабатывает программа. а дальше надо чтоб был массив. при чем динамический. но с этим вы мне помоги.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.12.2011, 16:24     что означает подобное объявление: TObject *Massiv[]; #11
Андрей2011, так ё-моё... У вас стек. Шаблонный. Стек подразумевает универсальность. Сегодня вам надо указатели хранить, завтра сами объекты. Переписывать будете? Но ещё раз, стек у вас шаблонный. Передавайте аргументом шаблона TObject *, и будет ваш стек хранить указатели, передавайте TObject - будет хранить объекты.
Ну а на счёт вектора - так лучше вообще std::stack использовать))
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
21.12.2011, 16:30  [ТС]     что означает подобное объявление: TObject *Massiv[]; #12
нет это все так всего много. по том буду разбираться с std::stack.
я просто там просто...я бы и рад хранить не ссылки а объекты но тогда у меня мой базовый объект обрубает всех наследников превращая все классы в базовый класс и выглядит это вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<class TObject>
class NewStack
{
public:
    NewStack(){KolObject=0;};
    void AddObject(TObject &Object)
    {
 
ptrarr = new TObject [10];
ptrarr[KolObject] =Object;
ptrarr[KolObject]->Print();
KolObject++;
    }
    int KolObject;
    TObject *ptrarr;
    ~NewStack() 
    { 
        //delete[] p_FThisObject;
    }; 
};
- по этому пришел к выводу что нада ссылки ставить.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
21.12.2011, 17:02     что означает подобное объявление: TObject *Massiv[]; #13
Андрей2011, наслаждайтесь:
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
#include <iostream>
 
template<typename T>
class Stack
{
public:
    typedef T value_type;
    typedef size_t size_type;
 
public:
    Stack():
    m_capacity(1),
    m_size(),
    m_stack(new value_type [m_capacity]())
    {
    }
 
    ~Stack()
    {
        delete [] m_stack;
    }
 
    void push(const value_type& value)
    {
        if (m_size >= m_capacity)
            reserve(m_capacity * 2);
 
        m_stack[m_size++] = value;
    }
 
    bool pop(value_type& value)
    {
        if (m_size == 0)
            return false;
 
        value = m_stack[--m_size];
 
        return true;
    }
 
private:
    void reserve(size_type new_capacity)
    {
        if (new_capacity <= m_capacity)
            return;
 
        value_type *new_stack = new value_type [new_capacity]();
 
        for (size_type i = 0; i < m_size; ++i)
            new_stack[i] = m_stack[i];
 
        delete [] m_stack;
 
        m_stack = new_stack;
        m_capacity = new_capacity;
    }
 
private:
    size_type m_capacity;
    size_type m_size;
    value_type *m_stack;
};
 
class Base
{
public:
    virtual void method() const = 0;
};
 
class Derived : public Base
{
public:
    virtual void method() const
    {
        std::cout << "Derived::method()" << std::endl;
    }
};
 
int main()
{
    Stack<Base *> stk;
 
    stk.push(new Derived());
    stk.push(new Derived());
    stk.push(new Derived());
 
    Base *val;
 
    while (stk.pop(val))
    {
        val->method();
 
        delete val;
    }
 
    return 0;
}
Специально привёл пример с полиморфным классом. Заметьте, стек с равным успехом может хранить целые числа, строки, векторы... Что угодно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2011, 10:57     что означает подобное объявление: TObject *Massiv[];
Еще ссылки по теме:

C++ Объявление целых типов с буквой - что означает эта буква?
C++ Что означает %1?
C++ Что означает (//) и (#)?

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

Или воспользуйтесь поиском по форуму:
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
22.12.2011, 10:57  [ТС]     что означает подобное объявление: TObject *Massiv[]; #14
спасибо. Буду разбираться.
Yandex
Объявления
22.12.2011, 10:57     что означает подобное объявление: TObject *Massiv[];
Ответ Создать тему
Опции темы

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