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

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

de
Offline Offline
Пол: Женский

« : 10-02-2006 13:06 » new

Господа,

караул! Может, кто-то может мне этот бред объяснить:

Есть большой проект, состоящий из подпроектов, т.е. выглядит это приблизительно так:

Proj_firma
   |
   Dllprint
   |
   Dllmain
   |
   Includes

В Dllprint есть класс CPManager  (cpm.h лежит в папке includes, cpm.cpp лежит в папке Dllprint)
И выглядят приблизительно так:
cpm.h:

Код:
#ifdef _DLLPRINT
#define DLLPRINT_DLLINTERFACE __declspec( dllexport )
#else  // _DLLPRINT
#define DLLPRINT_DLLINTERFACE __declspec( dllimport )
#endif // _DLLPRINT

class DLLPRINT_DLLINTERFACE CPManager 
{
public:
// …
static void SetInfo( CString sText );
static void SetPInfo( void* hP );

void ToIt() ;
private:
static CString m_cstrText;
static void* m_hProj;
};

cpm.cpp:

CString CPManager::m_cstrText(_T(""));
void* CPManager::m_hProj = NULL;
….
void CPManager::SetProInfo( void* hProject )
{ m_hProj = hProject;}

void CPManager::SetInfo( CString sText )
{ m_cstrText = sText;}

void CPManager::ToIt()
{ // … }


В Dllmain применяются вызовы как статических функций , так и создание инстанции самого класса с последующим вызовом обычных функций, т.е. :
Код:

CPManager::SetInfo ( cstrObjectName );

m_pPMgr = new CPManager;
m_pPMgr->DoIt();


При компиляции появляется следующее:

warning C4273: 'private: static class CString CPManager::m_cstrText' : inconsistent dll linkage.  dllexport assumed.
error C2491: CPManager::m_cstrText' : definition of dllimport static data member not allowed

warning C4273: 'private: static void * CPManager::m_hProj' : inconsistent dll linkage.  dllexport assumed.
error C2491: CPManager::m_hProject' : definition of dllimport static data member not allowed

warning C4273: CPManager::DoIt() inconsistent dll linkage.  dllexport assumed.

И в чем дело – не пойму…

« Последнее редактирование: 17-12-2007 17:28 от Алексей1153++ » Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #1 : 10-02-2006 13:13 » 

а разве статические процедуры класса могут работать с мемберами класса?

Надо указатель на мембер передать в функцию имхо...

А вообще - почему статические?
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 10-02-2006 13:23 » 

Леш,

проблема в том, что есть пара переменных, которые должны быть инициализированы на старте программы в Dllmain, а потом при работе программы они должны применяться в различных подпроектах   (dllprint один из них) при создании объекта типа CPManager.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 10-02-2006 13:37 » 

дык..

Код:
void F1(bool bGet, CString* pDest,bool bSet=false,CString* pInit=0 )
{
static CString txt="";

if(bSet)
{
//настроить
if(pInit)
{
txt=*pInit;
}
}
else
{
//прочитать
if(bGet && pDest)
{
*pDest=txt;
}
}
}

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #4 : 10-02-2006 13:38 » 

процедура не статическая, а мембер - статический.

ВО ВСЕХ экземплярах - значение мембера одинакое

//инитка
obj.F1(false,0,true,&mytext);

//чтение
obj.F1(true,&mytext);
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 10-02-2006 15:29 » 

Все, всем спасибо! Я нашла, почему - я случайно в тот подпроект, где использую CPManager, кроме cpm.h еще и cpm.cpp подвесила, вот и получился весь этот бред.

Леш,

иначе никак - при старте программы должны быть запомнены 2 параметра, которые мне потом нигде не найти, а в момент создания инстанции класса менеджера надо испольуовать те самые сохраненные на старте программы значения. При этом эта инстанция создается в разных местах программы и в разное время... Посему и сделала статическими переменные и функции, с помощью которых устанавливаю значения для этих самых переменных.
При этом в момент инициализации создавать инстанцию класса не хочется, да и бессмысленно это.
Если есть идея, как это сделать другим путем-расскажи, я просто ничего другого не придумала (хотя я пока еще не блондинка, но ведь и не мужчина Ага )
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #6 : 10-02-2006 20:08 » 

что за чушь про цвет волос и пол! Улыбаюсь  Не суть важно.

>>Если есть идея, как это сделать другим путем-расскажи,
смотри пост выше Улыбаюсь

static CString txt=инициализация;

эта статическая переменная в нестатической процедуре - то что тебе надо.( То что она инитится один раз - это тебе сейчас не надо как раз)
А вот то , что с помощью флагов bGet, bSet - можешь установить и прочитать значение, скажем вызвав процедуру из конструктора, а в конструктор в свою очередь параметр передать до этого

щас соображу пример
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #7 : 10-02-2006 20:29 » 

не создавать экземпляр класса не получится - придётся.

Код:
class X
{
X(){}

X(const char* ch)
{
F1(false,0,true, ch);
}

private:
void GetSetText(bool bGet, CString* pDest,bool bSet=false,const char* pInit=0 )
{
static CString txt="";
if(bSet)
{
//настроить
if(pInit){txt=pInit;}
}
else
{
//прочитать
if(bGet && pDest){*pDest=txt;}
}
}

private:
void SetText(const char* pInit)
{
GetSetText(false,0,true,pInit);
}
public:
void GetText(CString* pDest)
{
GetSetText(true,pDest);
}
};

Теперь в начале программы (где угодно, лишь бы до начала использования класса X) делаем инитку переменной:
Код:
X("некая строка текста"); //инициализация
в статическую переменную txt заносится нужная строка. Теперь все экземпляры класса X при вызове процедуры GetText(CString* pDest) запишут в переменную назначения одно и то же:
Код:
X x1;

CString text;
x1.GetText(&text);
text == "некая строка текста"

ИМХО я бы сделал так. Код я не компилил, тут студии нет, поэтому, возможно баги, но ты разберёшься, неблондика ты наша Улыбаюсь

естественно это не самое лучшее решение, я тоже не гений , наверняка есть и по другому способы
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines