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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2012, 21:54   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Виртуальное наследование и автоматическое обнуление объекта

Вообщем обстоятельства таковы. Если классу CommandsEx наследовать виртуально класс ConfigEx и в методе AttachCommands инициализировать структуру из класса ConfigsEx и там же в AttachCommands вывести куда-нить данные, данные считываются нормально и отображается желаемый результат...
Но, если обратиться к этим же данным в методе CmdPost (this->CommadsReq.IsPost, и т.д.) данные почему то уже нулевые, как будто обнулились, почему так происходит?
Если AttachConfig() вызвать в методе CmdPost, тогда все хорошо я получаю нужные мне данные, но такое меня не устраивает, метод CmdPost очень часто будет использоваться.

Код:
.h

class ConfigEx 
{
public:
 ConfigEx();
 virtual ~ConfigEx();

 void AttachConfig();

 struct CommandsReqEx
 {
  unsigned int IsPost;
  char PostSyntax[10];
  unsigned int PostType;
  unsigned int PostDelay;
  unsigned int PostLvlReq;
  unsigned int PostZenReq;
 }; 
 CommandsReqEx CommandsReq;

private:

protected:
};
extern ConfigEx Config;

.cpp

void ConfigEx::AttachConfig()
{
 this->CommandsReq.IsPost = GetPrivateProfileIntA("Commands", "IsPost", 1, COMMANDSREQ_PATH);
 GetPrivateProfileStringA("Commands", "PostSyntax", "", this->CommandsReq.PostSyntax, sizeof(this->CommandsReq.PostSyntax), COMMANDSREQ_PATH);
 this->CommandsReq.PostType = GetPrivateProfileIntA("Commands", "PostType", 1, COMMANDSREQ_PATH);
 this->CommandsReq.PostDelay = GetPrivateProfileIntA("Commands", "PostDelay", 60, COMMANDSREQ_PATH);
 this->CommandsReq.PostLvlReq = GetPrivateProfileIntA("Commands", "PostLvlReq", 50, COMMANDSREQ_PATH);
 this->CommandsReq.PostZenReq = GetPrivateProfileIntA("Commands", "PostZenReq", 0, COMMANDSREQ_PATH);

 char lpBuffer[255];
 wsprintfA(lpBuffer, "%d %s %d %d %d %d", this->CommandsReq.IsPost, this->CommandsReq.PostSyntax, this->CommandsReq.PostType, this->CommandsReq.PostDelay,
 this->CommandsReq.PostLvlReq, this->CommandsReq.PostZenReq);
 MessageBoxA(NULL, lpBuffer, "", MB_OK);
};
Код:
.h

class CommandsEx : public virtual ConfigEx, public virtual MessageEx
{
public:
 CommandsEx();
 virtual ~CommandsEx();
 void AttachCommands();
 bool CmdPost(LPOBJ lpObj, char *pMsg);
private:

protected:	
 
};
extern CommandsEx Commands;

.cpp

void CommandsEx::AttachCommands()
{
 this->AttachConfig();
 char lpBuffer[255];
 wsprintfA(lpBuffer, "%d %s", this->CommandsReq.IsPost, this->CommandsReq.PostZenReq);
 MessageBoxA(NULL, lpBuffer, "", MB_OK);
};

bool CommandsEx::CmdPost(LPOBJ lpObj, char *pMsg)
{
 char Msg[60];
 wsprintfA(Msg, "[POST][%s]: %d %d %s", lpObj->Name, this->CommandsReq.IsPost, this->CommandsReq.PostZenReq, pMsg);
 this->Message(MESSAGE::TO_PLAYER, MESSAGE::C_GREEN, lpObj->m_Index, Msg);
 return true;
};
Код:
int main()
{
 Commands.AttachCommands();
 Commands.CmdPost(1000, "Message");
 return 0;
}

Последний раз редактировалось coNsept; 20.06.2012 в 01:09.
coNsept вне форума Ответить с цитированием
Старый 19.06.2012, 23:33   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Если не ясна суть проблемы или я как-то не четко выразился, скажите... я постараюсь изложить более подробно.
coNsept вне форума Ответить с цитированием
Старый 19.06.2012, 23:44   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
неясно, на кой нужен префикс класса при объявлении конструкторов/деструкторов.
тему ниасилил. многа букав

Цитата:
Использую виртуальное наследование, метод очень удобный
после этого прекратил читать
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 19.06.2012, 23:53   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

мне не понятно, зачем нужны глобальные переменные в данном случае, и почему они объявлены, как внешнии.
_Bers вне форума Ответить с цитированием
Старый 19.06.2012, 23:59   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
очевидно же, чтобы доступ получать из разных точек программы. не синглтон - потому что объектов может быть несколько. как cin и cout.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 20.06.2012, 00:23   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2_Bers
очевидно же, чтобы доступ получать из разных точек программы. не синглтон - потому что объектов может быть несколько. как cin и cout.
Там попандосов никаких не выстрелит потом, из-за "неопределенного порядка инициализации единиц трансляции" ?

К тому же, судя по приведенному коду, данные глобальные объекты просятся быть деталью реализации механизмов, а не в свободном полете.
_Bers вне форума Ответить с цитированием
Старый 20.06.2012, 01:08   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Обновил первый пост, так думаю понятнее будет.
coNsept вне форума Ответить с цитированием
Старый 20.06.2012, 10:01   #8
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Я чет не понял, зачем виртуальное наследование? Предполагается робовидная сложная иерархия? Не видать ее... Используй агрегирование, в любом нормальном учебнике по С++ написано: агрегирование предпочтительнее, чем наследование. Тем более у тебя не видно нигде "is a". Виртуальное наследование никак не регламентировано стандартом, поэтому как там оно реализовано разработчиками компилятора остается предметом дополнительного исследования. А обнуление, судя по всему из-за отсутствия вызова конструктора базового класса.
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 20.06.2012 в 10:06.
Krok27 вне форума Ответить с цитированием
Старый 20.06.2012, 15:14   #9
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Проблема решилась, спасибо Krok27. Действительно не вызывался конструктор базового класса, его нужно вызывать явно.
coNsept вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Виртуальное время для игры aleksandr278 Помощь студентам 13 20.03.2010 21:22
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37
Автоматическое уничтожение объекта mutabor Общие вопросы Delphi 6 25.06.2008 22:25
Виртуальное в виртульности (Virtual Machine) Veiron Свободное общение 0 01.02.2008 21:27