Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к статичному экземпляру класса 
V
    Опции темы
InfMag
Дата 12.5.2012, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: нет
Всего: 4



Доброго времени суток!

Я может недопонимаю концепт, но у меня возникла следующая загвоздка: я пишу некое приложение с использованием FMOD-либы. У меня есть класс, который будеть хранить и воспроизводить несколько звуков, каждый звук будет экземпляром класса. Реализация общения с FMOD будет вне класса абстрактна, но инициализировать новый звукопоток под каждый звук не практично и я делаю основной экземпляр класса FMOD-системы static. Но у меня возникает проблема, я не могу передать ссылку на адрес памяти от этого static экземпляра. Наглядно:

Так НЕ могу:
Код

//sound.hpp
#include "fmod/fmod.hpp"

class TickSound {
    static FMOD::System *fmod;
public:
    TickSound();
};

//sound.cpp
#include "sound.hpp"
#include "fmod/fmod.hpp"

TickSound::TickSound() {
    FMOD::System_Create(&this->fmod);
}

Отчёт об ошибке:
Код

src/sound.o: In function `TickSound::TickSound()':
sound.cpp:(.text+0x17): undefined reference to `TickSound::fmod'
collect2: выполнение ld завершилось с кодом возврата 1


А вот так (когда убираю static) МОГУ:
Код

//sound.hpp
#include "fmod/fmod.hpp"

class TickSound {
    FMOD::System *fmod;
public:
    TickSound();
};

//sound.cpp
#include "sound.hpp"
#include "fmod/fmod.hpp"

TickSound::TickSound() {
    FMOD::System_Create(&this->fmod);
}


Я не могу понять, почему? Кто-нибудь может прояснить? И как реализовать то, что я пытаюсь правильно? Заранее сердечно благодарю!
PM   Вверх
InfMag
Дата 12.5.2012, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: нет
Всего: 4



И кстати! хочу сразу спросить: как в конструкторе определить, что класс уже инициализирован? Чтобы инициализировать его только один раз, а следующие сконструированные классы не пытались его инициализировать?
PM   Вверх
mes
Дата 12.5.2012, 16:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



статический дата-член в классе только объвляется.. для его определения в любом (одном) .cpp напишите 

Код

FMOD::System * TickSound::fmod;


Добавлено через 2 минуты и 21 секунду
Цитата(InfMag @  12.5.2012,  15:23 Найти цитируемый пост)
 а следующие сконструированные классы не пытались его инициализировать? 

1. инициализировать не в конструкторе, а явно в маин..
2. проверять на нуль, перед созданием
3. смотрите патерн синглетон.. 



--------------------
PM MAIL WWW   Вверх
InfMag
Дата 12.5.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: нет
Всего: 4



mes, спасибо! Теперь всё получилось:
Код

//sound.hpp
#include "fmod/fmod.hpp"

class TickSound {
    static FMOD::System *fmod;
public:
    TickSound();
};

//sound.cpp
#include "sound.hpp"
#include "fmod/fmod.hpp"

FMOD::System *TickSound::fmod;
bool inited = false;

TickSound::TickSound() {
    if (!inited) {
        FMOD::System_Create(&this->fmod);
        inited = true;
    }
}

PM   Вверх
mes
Дата 12.5.2012, 16:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(InfMag @  12.5.2012,  15:38 Найти цитируемый пост)
  if (!inited) {

доп переменная не нужна.. достаточно проверки на нуль.. 



--------------------
PM MAIL WWW   Вверх
InfMag
Дата 12.5.2012, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: нет
Всего: 4



mes, теперь вот так:
Код

//sound.hpp
#include "fmod/fmod.hpp"

class TickSound {
    static FMOD::System *fmod;
public:
    TickSound();
};

//sound.cpp
#include "sound.hpp"
#include "fmod/fmod.hpp"

FMOD::System *TickSound::fmod;

TickSound::TickSound() {
    if (this->fmod == NULL) FMOD::System_Create(&this->fmod);
}

PM   Вверх
mes
Дата 12.5.2012, 16:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(InfMag @  12.5.2012,  15:44 Найти цитируемый пост)
 теперь вот так:

как минимум, я б проверку с инициализацией вынес в отдельную статическую функцию, которую уж вызывал бы из конструктора.. 



--------------------
PM MAIL WWW   Вверх
InfMag
Дата 12.5.2012, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: нет
Всего: 4



mes, а для статической функции ведь недоступен this, к ней можно обращаться и без экземпляра класса, разве это применимо в данном контексте?
PM   Вверх
mes
Дата 12.5.2012, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(InfMag @  12.5.2012,  21:13 Найти цитируемый пост)
 а для статической функции ведь недоступен this, к ней можно обращаться и без экземпляра класса, разве это применимо в данном контексте? 

так fmod также статическая smile и this-> в примере абсолютно не нужен... эта возможность для унификации обращения к стат членам как к нестатическим.. 



--------------------
PM MAIL WWW   Вверх
InfMag
Дата 12.5.2012, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: нет
Всего: 4



mes, действительно! Спасибо!
PM   Вверх
EvilsInterrupt
Дата 12.5.2012, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



InfMag
Мне кажется mes прав и Вы пишете синглтон. Если мне кажется правильно и mes прав, то
может лучше так:
Код

class Singleton
{
public:
    static Singleton& getInstance()
    {
        static Singleton instance;
        std::cout << "getInstance()" << std::endl;
        return instance;
    }
private:
    Singleton(const Singleton&);

    Singleton()
    {
        std::cout << "Singleton()" << std::endl;
    }
};


Это более удачная конструкция, т.к. конструктор спрятан и ошибки компиляции предупредят о 
попытках создать еще один объект класса.
PM MAIL WWW ICQ Jabber   Вверх
InfMag
Дата 12.5.2012, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: нет
Всего: 4



EvilsInterrupt, нет, в моём случае экземпляров класса будет несколько.
PM   Вверх
mes
Дата 13.5.2012, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(InfMag @  12.5.2012,  22:34 Найти цитируемый пост)
нет, в моём случае экземпляров класса будет несколько. 

синглетон вместо статической фмод..

Добавлено через 4 минуты и 14 секунд
т.е. вынести фмод за пределы ТикСаунд


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.