Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Массив классов внутри класса  (Прочитано 17947 раз)
0 Пользователей и 1 Гость смотрят эту тему.
godlsd
Гость
« : 08-08-2009 08:41 » 

В общем существует 2 класса, один из них определяет параметры объекта, второй заполняет эти параметры, количество объектов динамическое, сами объекты должны быть доступны глобально, как объявить массив классов параметров объекта так чтобы они были доступны глобально???
Вот то что есть
Код:
class cCharacter{
  public:
        int cType;
int cXScrPos;
int cYScrPos;
int cXPos;  
int cYPos;    
int cIDonMap;
int cID;
        cCharacter(void);
        cCharacter(void* lpObjData);
};
class cCharacters{
public:
        struct sChar{
       void* lplpChar;
       int Count;
        } Char;
        struct slpChar{
       void* lpFirstObject;
       void* lpLastObject;
        } lpChar;
        cCharacters(void);
        int GetCharacters(void);
};
« Последнее редактирование: 08-08-2009 18:42 от Вад » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 08-08-2009 08:46 » 

Честно говоря не понял основную мысль. Опиши подробнее. зачем тебе это надо. Может есть более лучшее решение.

А так приходит на ум. Singleton, STL::list, Фабрика классов, Виртуальные функции.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
godlsd
Гость
« Ответ #2 : 08-08-2009 08:53 » 

Я в С++ новенький=) только четвёртый день, не знаю что такое Singletone, можно подробнее...
Это нужно для игры, в ней объекты хранятся в отдельных массивах, из которых информацию мне нужно перенести в тело моей программы, а потом иметь доступ к каждому из этих объектов...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 08-08-2009 09:09 » 

Синглетон это шаблон программирования. К С++ имеет отношение поскольку, постольку. Он обеспечивает создание только одного экземпляра класса на всем пространстве исполняемого кода. Вот описание из вики http://ru.wikipedia.org/wiki/Singleton
Там есть примеры создания данного шаблона.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
godlsd
Гость
« Ответ #4 : 08-08-2009 09:35 » 

Почитал про Singleton! Спасибо будем попробовать...
Записан
godlsd
Гость
« Ответ #5 : 08-08-2009 09:38 » 

СТоп...ёёёё , сингл тон он же для того и синглтон, чтобы быть в одном экземпляре!!! А мне нужно много экземпляров, точнее их массив!!! Он то будет доступен из-зо всех точек, но только как один объкт... НЕ ПОДХОДИТ=(
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 08-08-2009 09:45 » 

Ну и? Сам массив будет в одном экземпляре, доступный со всех точек. А вот что массив будет хранить внутри, его будет много. А если еше совместить с фабрикой классов. Тогда можно свести все в одну точку и не размазывать по всей программе.
Фабрика классов будет сама создавать экземпляры классов и сама заносить в массив, выдавая тебе id твоего экземпляра. Сам массивчик внутри можно сделать на stl::vector.
« Последнее редактирование: 08-08-2009 09:48 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 08-08-2009 09:47 » 

Налицо непонимание разницы между классом и объектом.

Класс - это тип данных. Через RTTI, конечно, можно получить объекты, описывающие типы. Только с ними ты ничего не сделаешь. И вообще это не нужно.

А нужно множество глобально доступных объектов.
Код: (C++)
class X { /* ... */ };
class Y { /* ... */ };

class GlobalDictionary
 {
  public:
   static X x;
   static Y y;
 };
Тогда в коде программы можно к ним обращаться:
Код: (C++)
/* ... */ GlobalDictionary::x /* ... */
/* ... */ GlobalDictionary::y /* ... */

Но это жёсткий перечень, задаваемый при компиляции. Тебе же надо менять состав объектов. Значит нужен массив. Чтобы разнородные объекты хранить в общем массиве, классы этих объектов должны быть унаследованы от общего предка.
Код: (C++)
#include <vector>

using namespace std;

class Parent { /* ... */ };
class X: public Parent { /* ... */ };
class Y: public Parent { /* ... */ };

class GlobalDictionary
 {
  public:
   typedef ParentsVector vector<Parent>;
   static ParentsVector objects;
 };
Тогда в коде программы можно к ним обращаться:
Код: (C++)
/* ... */ GlobalDictionary::objects[0] /* ... */
/* ... */ GlobalDictionary::objects[1] /* ... */
Если порядковые номера хочется заменить на осмысленные названия, то можно либо ввести enum, либо вместо массива типа vector использовать словарь типа map.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
godlsd
Гость
« Ответ #8 : 08-08-2009 09:51 » 

А если я такую штуку упорю будет глобально доступен каждый экземпрляр класса ??

Код:
cCharacters::GetCharacters(){
        character=new cCharacter[Char.Count];
        return(0);

}

class cCharacters{
public:
        struct sChar{
       void* lplpChar;
       int Count;
        } Char;
        struct slpChar{
       void* lpFirstObject;
       void* lpLastObject;
        } lpChar;
        cCharacter *character;
        int GetCharacters(void);
        cCharacters(void);
}
« Последнее редактирование: 08-08-2009 18:46 от Вад » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 08-08-2009 10:05 » 

У тебя будет течь памяти и очень большая. + потеря предыдуших экземпляров класса. Вывод. Читай книжку по С++, прежде чем пользоваться языком.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
godlsd
Гость
« Ответ #10 : 08-08-2009 11:56 » 

Слушаюсь и повинуюсь дядя Администратор=))) Действительно глянул в ватчах, утечка=))) Читаю Эдисона Весли....Фабрики объектов=)
Записан
godlsd
Гость
« Ответ #11 : 14-08-2009 11:47 » 

Код:
cCharacters::GetCharacters(){
        character=new cCharacter[Char.Count];
        return(0);

}

class cCharacters{
public:
        struct sChar{
       void* lplpChar;
       int Count;
        } Char;
        struct slpChar{
       void* lpFirstObject;
       void* lpLastObject;
        } lpChar;
        cCharacter *character;
        int GetCharacters(void);
        cCharacters(void);
}

И ничего тут течь не будет просто ошибочку надо подправить!!!

cCharacter *character;  -> cCharacter* character;
« Последнее редактирование: 14-08-2009 12:16 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 14-08-2009 14:42 » 

Цитата
cCharacter *character;  -> cCharacter* character;
да, в этом и было дело Отлично
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 15-08-2009 07:44 » 

Цитата: godlsd
И ничего тут течь не будет просто ошибочку надо подправить!!!

cCharacter *character;  -> cCharacter* character;
Нет, этого мало, ещё надо с бубном пройтись вокруг компьютера - вот тогда боги будут довольны.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 15-08-2009 11:56 » 

А может всё дело в том, что название класса cCharacter выбрано неправильно. Сначала маленькая с, а за ней сразу большая С. Некоторые компиляторы этого очень не любят. Можно попробовать варианты Ссharacter, или ещё лучше СCharacter. Иначе компилятор не знает к чему относится первая с, а к чему вторая.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Mayor
Специалист

ru
Offline Offline

« Ответ #15 : 23-08-2009 06:26 » new

Я в С++ новенький=) только четвёртый день, не знаю что такое Singletone, можно подробнее...
Это нужно для игры, в ней объекты хранятся в отдельных массивах, из которых информацию мне нужно перенести в тело моей программы, а потом иметь доступ к каждому из этих объектов...

дак не используй пока взаимодействие классов и объектов

В общем существует 2 класса, один из них определяет параметры объекта, второй заполняет эти параметры, количество объектов динамическое, сами объекты должны быть доступны глобально, как объявить массив классов параметров объекта так чтобы они были доступны глобально???
Вот то что есть

у тебя тут путаница идет в терминах объектов класса и объектов игры, просто попробуй описать эту часть игровой логики 1-2 абзацами безо всякой привязки к с++, и пример кода в main который должен использовать эти объекты
Записан

1n c0de we trust
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines