Вопрос про статические члены
От: J-son  
Дата: 30.06.11 12:11
Оценка:
Здравствуйте,
Вопрос такой:

В основной программе есть класс

class Test
{
static int a = 0;
}

Test t;
t.a = 10;

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

extern "C" void funk()
{
Test t;
int b = t.a;
}

Возможно ли сделать так, чтобы класс в библиотеке знал про значение статического члена a?
Понятно, что его можно передать через параметр, но можно ли как то сыграть на том, что он статический?
Получается, что для библиотеки класс описан точно так же, но это уже ее класс. А вот хотелось бы, чтобы он знал про статические члены класса из вызывающей программы.
Re: Вопрос про статические члены
От: Erop Россия  
Дата: 30.06.11 12:47
Оценка: 1 (1)
Здравствуйте, J-son, Вы писали:

JS>Понятно, что его можно передать через параметр, но можно ли как то сыграть на том, что он статический?

JS>Получается, что для библиотеки класс описан точно так же, но это уже ее класс. А вот хотелось бы, чтобы он знал про статические члены класса из вызывающей программы.

1) Что за библиотека? lib, dll, so, SharedLibrary?
2) В стандарте это дело никак не урегулировано, но общая идея обычно состоит в том, что если класс берут из библы, то и его стат. член берут оттуда же. В этом смысле код членов класса от его статических данных не сильно отличается.

То есть если у теюя срр-шник класса есть в lib, то в остальной программе достаточно иметь только хедер. срр возьмут из библы при линковке.

Если это не lib, а какая-то библиотека, которая не все потроха наружу выставляет, а только как-то особо заявленные, например dll, то надо класс как-то экспортировать.
Для более предметного ответа на вопрос как это делается, нужен твой ответ на (1)

Например для MSVC и DLL надо сделать так, чтобы при компиляции хедера в библиотеке перед классом боло написано __declspec(dllexport), а при компиляции того же хедера в остальных метах было написано __declspec(dllimport). Обычно это делают так, как-то:
#ifdef BUILD_TEST_DLL
#    define TEST_DLL_API __declspec(dllexport)
#else//BUILD_TEST_DLL
#    define TEST_DLL_API __declspec(dllimport)
#endif//!BUILD_TEST_DLL

TEST_DLL_API class Test {
public:
    static int a;
};
и в проекте DLL предопределяют макрос BUILD_TEST_DLL
Ни или с .def файлом мутят и опциями линкера.


Кстати, инициалищировать в теле классам можно только константные целочисленные поля. Неконстантные нельзя...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Вопрос про статические члены
От: J-son  
Дата: 30.06.11 13:23
Оценка: :)))
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, J-son, Вы писали:


JS>>Понятно, что его можно передать через параметр, но можно ли как то сыграть на том, что он статический?

JS>>Получается, что для библиотеки класс описан точно так же, но это уже ее класс. А вот хотелось бы, чтобы он знал про статические члены класса из вызывающей программы.

E>1) Что за библиотека? lib, dll, so, SharedLibrary?

E>2) В стандарте это дело никак не урегулировано, но общая идея обычно состоит в том, что если класс берут из библы, то и его стат. член берут оттуда же. В этом смысле код членов класса от его статических данных не сильно отличается.

E>То есть если у теюя срр-шник класса есть в lib, то в остальной программе достаточно иметь только хедер. срр возьмут из библы при линковке.


E>Если это не lib, а какая-то библиотека, которая не все потроха наружу выставляет, а только как-то особо заявленные, например dll, то надо класс как-то экспортировать.

E>Для более предметного ответа на вопрос как это делается, нужен твой ответ на (1)

E>Например для MSVC и DLL надо сделать так, чтобы при компиляции хедера в библиотеке перед классом боло написано __declspec(dllexport), а при компиляции того же хедера в остальных метах было написано __declspec(dllimport). Обычно это делают так, как-то:
#ifdef BUILD_TEST_DLL
E>#    define TEST_DLL_API __declspec(dllexport)
E>#else//BUILD_TEST_DLL
E>#    define TEST_DLL_API __declspec(dllimport)
E>#endif//!BUILD_TEST_DLL

E>TEST_DLL_API class Test {
E>public:
E>    static int a;
E>};
E>
и в проекте DLL предопределяют макрос BUILD_TEST_DLL

E>Ни или с .def файлом мутят и опциями линкера.
E>

E>Кстати, инициалищировать в теле классам можно только константные целочисленные поля. Неконстантные нельзя...

На самом деле то, что я хочу, гораздо проще.
Немножко упрощу:
Допустим есть 2 независимые программы, которые используют один и тот же класс.
Если в одной программе в классе статическому члену присвоили какое то значение, то возможно ли сделать так, чтобы соответствующее изменение было бы в соответствующем члене в этом же классе в другой программе.
Re[3]: Вопрос про статические члены
От: Erop Россия  
Дата: 30.06.11 13:35
Оценка:
Здравствуйте, J-son, Вы писали:

JS>Немножко упрощу:

JS>Допустим есть 2 независимые программы, которые используют один и тот же класс.
JS>Если в одной программе в классе статическому члену присвоили какое то значение, то возможно ли сделать так, чтобы соответствующее изменение было бы в соответствующем члене в этом же классе в другой программе.


Нихрена себе "упростил"...
В принципе, оно конечно как-то можно, но если я не ошибаюсь относительно твоего уровня в этих делах, то тебе лучше так не делать.
Попробуй, для начала какие-нибудь общепринятые и высокоуровневые соредства межпроцессного взаимодействия. Ну там трубы или RPC, какое-нибудь...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Вопрос про статические члены
От: max-maxtor Россия www.rsdn.ru
Дата: 30.06.11 13:37
Оценка:
Здравствуйте, J-son, Вы писали:

JS>Здравствуйте,

JS>Вопрос такой:

JS>В основной программе есть класс


JS>class Test

JS>{
JS> static int a = 0;
JS>}

JS>Test t;

JS>t.a = 10;

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


JS>extern "C" void funk()

JS>{
JS> Test t;
JS> int b = t.a;
JS>}

JS>Возможно ли сделать так, чтобы класс в библиотеке знал про значение статического члена a?

JS>Понятно, что его можно передать через параметр, но можно ли как то сыграть на том, что он статический?
JS>Получается, что для библиотеки класс описан точно так же, но это уже ее класс. А вот хотелось бы, чтобы он знал про статические члены класса из вызывающей программы.


class Test
{
   static int a;
};
int Test::a = 0;
Re[4]: Вопрос про статические члены
От: J-son  
Дата: 30.06.11 13:42
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, J-son, Вы писали:


JS>>Немножко упрощу:

JS>>Допустим есть 2 независимые программы, которые используют один и тот же класс.
JS>>Если в одной программе в классе статическому члену присвоили какое то значение, то возможно ли сделать так, чтобы соответствующее изменение было бы в соответствующем члене в этом же классе в другой программе.


E>Нихрена себе "упростил"...

E>В принципе, оно конечно как-то можно, но если я не ошибаюсь относительно твоего уровня в этих делах, то тебе лучше так не делать.
E>Попробуй, для начала какие-нибудь общепринятые и высокоуровневые соредства межпроцессного взаимодействия. Ну там трубы или RPC, какое-нибудь...

Ну ладно, спасибо)
Re: Вопрос про статические члены
От: MasterZiv СССР  
Дата: 30.06.11 13:53
Оценка:
On 30.06.2011 16:11, J-son wrote:

> Здравствуйте,

> Вопрос такой:
>
> В основной программе есть класс
>
> class Test
> {
> static int a = 0;
> }
>
> Test t;
> t.a = 10;
>
> Эта программа вызывает функцию из библиотеки, в которой есть точно такой же класс.
>
> extern "C" void funk()
> {
> Test t;
> int b = t.a;
> }
>
> Возможно ли сделать так, чтобы класс в библиотеке знал про значение статического
> члена a?

Код "в библиотеке" и так уже это знает. Он его использует.
Класс "в библиотеке" и "не в библиотеке" один. Класс -- это тип объектов,
он вообще один в программе во всей.

> Понятно, что его можно передать через параметр, но можно ли как то сыграть на

> том, что он статический?

Ты уже это сделал.

> Получается, что для библиотеки класс описан точно так же, но это уже ее класс.


Ещё раз, класс везде один и только один.

А
> вот хотелось бы, чтобы он знал про статические члены класса из вызывающей программы.

Он уже знает. Твой код его использует.

> extern "C" void funk()

> {
> Test t;
> int b = t.a; // использование статического члена класса.
> }

А, понял. Можно написать ещё так:

extern "C" void funk()
{
int b = Test::a; // использование статического члена класса.
}
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Пожалуйста...
От: Erop Россия  
Дата: 30.06.11 13:53
Оценка: 3 (1) +1
Здравствуйте, J-son, Вы писали:
E>>Попробуй, для начала какие-нибудь общепринятые и высокоуровневые соредства межпроцессного взаимодействия. Ну там трубы или RPC, какое-нибудь...

JS>Ну ладно, спасибо)


Для "спасибо" тут есть кнопки
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Вопрос про статические члены
От: J-son  
Дата: 30.06.11 13:59
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>On 30.06.2011 16:11, J-son wrote:


>> Здравствуйте,

>> Вопрос такой:
>>
>> В основной программе есть класс
>>
>> class Test
>> {
>> static int a = 0;
>> }
>>
>> Test t;
>> t.a = 10;
>>
>> Эта программа вызывает функцию из библиотеки, в которой есть точно такой же класс.
>>
>> extern "C" void funk()
>> {
>> Test t;
>> int b = t.a;
>> }
>>
>> Возможно ли сделать так, чтобы класс в библиотеке знал про значение статического
>> члена a?

MZ>Код "в библиотеке" и так уже это знает. Он его использует.

MZ>Класс "в библиотеке" и "не в библиотеке" один. Класс -- это тип объектов,
MZ>он вообще один в программе во всей.

Библиотека — это отдельный проект, и там класс описан так же, как и в основном проекте
Re[3]: Вопрос про статические члены
От: Erop Россия  
Дата: 30.06.11 15:09
Оценка:
Здравствуйте, J-son, Вы писали:

JS>Библиотека — это отдельный проект, и там класс описан так же, как и в основном проекте


Это, с точностью до управления экспортом-импортом -- хорошо.
Но общим должен быть только хедер, а cpp во всей программе должен быть только один.
Но ты, как я понял, вообще-то не библиотеками интересуешься? Или таки библиотеками?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.