Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2012, 13:09   #1
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
Вопрос Расширение области видимости локального объекта на все файлы.

Здравствуйте!

Сомневаюсь, что название темы достаточно конкретно, постараюсь раскрыть вопрос.
Итак, пишу программу (тетрис) с использованием SDL. Программа разбита на файлы.

В файле, в котором находится определение метода инициализации всех необходимых данных и объектов для программы, есть также и объявление и инициализация статического объекта, который является таблицей цветов. И проблема как раз в том, что он является локальным и действует в пределах этой функции:
Код:
CColors CTable ( Surf_Display );
Та же проблема есть и с объектом стакана, в которых складываются фигурки:
Код:
CTGlass GlassObject ( WidthBlocks, HeightBlocks );
Другие объекты являются динамическими, поэтому их объявление находится в заголовочном файле и они являются членами класса, а инициализация - в другом файле:
Код:
CTTetromino* Tetromino; //Этот объект является членом класса
Вот заголовочный файл класса тетриса:

Код:
#ifndef _CAPP_H_
#define _CAPP_H_

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <SDL/SDL.h>

#include "CEvent.h"
#include "CTGFX.h"
#include "CGraph.h"
#include "CSurface.h"
#include "CColor.h"
#include "CTTetromino.h"
#include "CTGlass.h"

class CApp : public CEvent
{
	private:

		bool Running;

		SDL_Surface* Surf_Display;

	private:

		SDL_Surface* Surf_BlockSpriteBlack;
		SDL_Surface* Surf_BlockSpriteDimGrey;
		SDL_Surface* Surf_BlockSpriteRed;
		SDL_Surface* Surf_BlockSpriteForestGreen;
		SDL_Surface* Surf_BlockSpriteDodgerBlue;
		SDL_Surface* Surf_BlockSpriteGoldenRod;

		SDL_Surface* Surf_Her;

	private:

		int WidthBlocks, HeightBlocks, BlockSide;
		int StartXpixels, StartYpixels;

	private:

		unsigned char* Glass;

		CTTetromino* Tetromino; //Этот объект является членом класса

	public:

		CApp ( int W, int H, int B );

		int OnExecute ( );

	public:

		bool OnInit ( );

		void OnEvent ( SDL_Event* Event );
		void OnLoop ( );
		void OnRender ( );
		void OnCleanup ( );

	public:

		int GetWidth ( );
		int GetHeight ( );

	public:

		void OnExit ( );
};

#endif
Вот файл с методом инициализации, в котором впервые и единожды объявляется и одновременно инициализируется объект цветовой таблицы и стакана:

Код:
#include "CApp.h"

bool CApp::OnInit ( )
{
	if ( SDL_Init ( SDL_INIT_EVERYTHING ) < 0 )
		{
			return false;
		}

	if ( ( Surf_Display = SDL_SetVideoMode ( 640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF ) ) == NULL )
		{
			return false;
		}

	//if ( ! CColours::InitColorTable ( Surf_Display ) )
	//	return false;

	CColors CTable ( Surf_Display );

	CTBlockSprite BlockSprite ( 20, 20 );

	StartXpixels = ( ( Surf_Display->w ) - ( WidthBlocks + 2 ) * BlockSide ) / 2;
	StartYpixels = ( ( Surf_Display->h ) - ( HeightBlocks + 1 ) * BlockSide ) / 2;

	//Uint32 Grey = SDL_MapRGB ( Surf_Display->format, 100, 100, 100 );
	//Colours[C_DimGrey] = SDL_MapRGB ( Surf_Display->format, 100, 100, 100 );

	if ( ( Surf_BlockSpriteBlack = CSurface::OnMakeFromSprite ( BlockSprite, CTable[ColorBlack] ) ) == NULL )
		{
			return false;
		}

	if ( ( Surf_BlockSpriteDimGrey = CSurface::OnMakeFromSprite ( BlockSprite, CTable[ColorDimGrey] ) ) == NULL )
		{
			return false;
		}
	/*
		if ( ( Surf_Her = CSurface::OnLoad ( "her.bmp" ) ) == NULL )
			{
				return false;
			}
	*/
	CTGlass GlassObject ( WidthBlocks, HeightBlocks );

	Glass = GlassObject.GetArray ( );

	return true;
}
Итак, вопрос: как в этой ситуации расширить область видимости этих объектов? Учитывая, что объект должен быть виден и в других файлах.

Спасибо за внимание!

Евгений.
mmx358 вне форума Ответить с цитированием
Старый 09.07.2012, 14:15   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

синглетон, не?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.07.2012, 16:27   #3
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

Чего-чего-чего?
mmx358 вне форума Ответить с цитированием
Старый 09.07.2012, 17:19   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Синглтон
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.07.2012, 17:41   #5
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

Простите, я прочитал это, но совершенно не понимаю, что это значит и как это используется. Если вам не сложно, не могли бы вы коротко объяснить человеческим языком, а не "как на википедии", как это работает?
mmx358 вне форума Ответить с цитированием
Старый 10.07.2012, 10:12   #6
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Синглтон - это шаблон проектирования программного обеспечения. Синглтон (одиночка) - класс, который должен гарантировать свою уникальность в пределах программы, только один экземпляр данного класса на всю программу. Обычно у него закрытый конструктор и доступ к экземпляру осуществляется через статический метод.

Код:
class Singlton
{
 private:
  Singlton(){}
  float _myData;
public:
 static Singlton& Hinstance()
{
  static Singlton Obj;
  return Obj;

}

float getData(){return _myData}


};
где то в коде программы:
Код:
 float Data = Singlton::Hinstance().getData();
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 10.07.2012 в 10:19.
Krok27 вне форума Ответить с цитированием
Старый 10.07.2012, 11:18   #7
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

Krok27, спасибо, вроде стало чуть-чуть яснее, что это за штуковина, хотя четкого представления нет. Оно выглядит как-то неестественно для меня, мы только что в весеннем семестре проходили С++ и я решил для закрепления написать тетрис + чтобы немножко ознакомиться с SDL.

Кажется, до меня немного дошло, как это применить, спасибо!

Еще такой вопрос оффтопный.

Если я хочу, чтобы мой объект был виден во всех методах класса, я могу объявить его как динамический член-объект в объявлении класса (в заголовочном файле).

При этом без проблем его инициализация происходит в одном из методов класса, членом которого он является и виден во всех членах-методах этого класса.

Однако, getter`ы возвращают указатели на переменные вместо значений переменных, т.к. идентификатор объекта является указателем на объект. В случае статического объекта никаких проблем нет.

Как "подправить" динамические объекты, чтобы они возвращали данные в том же формате, что и статические объекты того же класса?

И в каком виде в случае динамического объекта его методом возвращается указатель? Как указатель на указатель?

Как быть?
mmx358 вне форума Ответить с цитированием
Старый 10.07.2012, 14:52   #8
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Многабукв. Геттер может возвращать и ссылку на динамический объект. Только зачем?
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 10.07.2012, 15:18   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
getter`ы возвращают указатели на переменные вместо значений переменных, т.к. идентификатор объекта является указателем на объект.
что за бред?
если вы возвращаете указатели то значит это вы так написали.

идентификатор обьекта, this чтоль?
но это не мешает вам вернуть значение переменной а не указатель на нее.

просто помните что в функции this это я сам, обьект к которому вызван метод.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.07.2012, 11:18   #10
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

Пепел Феникса, в общем, я перепутал и написал про геттер, а на самом деле была проблема с оператором индексирования. Я использовал его с динамическим объектом так:

obj [ index ];

А надо было так: ( * obj ) [ index ];

Т.ч. теперь мои объекты благополучно будут членами класса и никаких проблем с областью видимости не будет.

Я не там копал, короче.

Спасибо всем за помощь, тему можно закрывать.
mmx358 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу для определения принадлежности точки с координатами (х,у) заштрихованной области. Попадание на границу области sanek@zaputan Помощь студентам 5 09.03.2012 12:00
Проверить принадлежит ли точка закрашенной области, границе или находится вне области (код на Pascal) homk Помощь студентам 3 07.09.2011 23:16
Вопрос по области видимости LMnet Общие вопросы C/C++ 2 04.04.2011 08:02
Как поменять одну из текстур объекта не меняя все остальные и без повторной загрузки объекта в GLScene DomKr@t Мультимедиа в Delphi 0 14.12.2008 01:52
Как сделать чтобы новые строки всегда были в области видимости? neugadal Microsoft Office Excel 9 06.09.2008 12:23