статические переменные класса. доступ из стороннего модуля.
От: Sad Brother Россия  
Дата: 10.03.08 20:35
Оценка:
Есть класс, в заголовке которого есть примерно следующее содержание:
MyClass.h
class MyClass:
{
public:
...
private:
...
protected:
static char *a[];
static char* b[];
}

в MyClass.cpp файле находиться следующее:
...
char* MyClass::a[] = {"1", "12", "123", "1234"};
char* MyClass::b[] = {"q", "qw", "qwe", "qwer", "qwert"};
...

никакой другой функциональности по работе с данными массивами не представляется.
Из данных файлов получается dll и lib-а, которые далее можно использовать, совместно с заголовочным файлом, конечно же.
Необходимо написать функцию, в стороннем модуле test.cpp, с помощью которой можно было бы вычислить размер заданных массивов, то есть что-то вроде sizeof(a)/sizeof(a[0]).

прямого доступа к данным полям класса MyClass нет, так как они объявлены как protected.
Для решения этой проблемы создал свой класс:
class MyCloneClass : public MyClass{
}

далее осталось написать функцию, которая бы непосредственно получала длину массивов.
первая попытка написать что-то вроде:
unsigned int MyCloneClass::getLenA(){
 return sizeof(a)/sizeof(a[0]);
}

провалилась с ошибкой: "''char* []'': illegal sizeof operand", или что-то в этом роде. После недолгих мучений стало слегка понятно почему это произошло... про sizeof известно следующее:

It is the responsibility of the compiler's author to implement the sizeof operator in a way specific and correct for a given implementation of the language. The sizeof operator must take into account the implementation of the underlying memory allocation scheme to obtain the sizes of various datatypes. sizeof is a compile-time operator, which means that during compilation, sizeof and its operand get replaced by the result-value. This is evident in the assembly language code produced by a C or C++ compiler. For this reason, sizeof qualifies as an operator, even though its use sometimes looks like a function call.

если честно, то дальше я встал в тупик...
есть у кого-нибудь какие-либо соображения о том, как можно достучаться до массивов так, чтобы можно было получить их размер, не добавляя функциональности в базовый класс???
Re: статические переменные класса. доступ из стороннего моду
От: VoidEx  
Дата: 11.03.08 00:19
Оценка:
Здравствуйте, Sad Brother,

Ну так понятно, почему. А если реализацию изменили?
На .h это никак не скажется, а вот размерность массива уже будет другая.
Так что, видимо, только добавлять что-то в классе.
Re: статические переменные класса. доступ из стороннего моду
От: Roman Odaisky Украина  
Дата: 11.03.08 09:41
Оценка:
Здравствуйте, Sad Brother, Вы писали:

[]

Тебе нужно, чтобы в интерфейсе класса (*.h) были члены, хранящие этот размер. Иначе никак — что делать в случае перекомпиляции .cpp?

Два варианта:

1.
class MyClass
{
    . . .
    static boost::array<char const *, 4> m_data;
};

boost::array<char const *, 4> MyClass::m_data = { "Hello", "world", "from", "RSDN" };

2.
class MyClass
{
    . . .
    static char const* m_data[];
    static std::size_t const m_cData;
};

char const* MyClass::m_data[] = { "Hello", "world", "from", "RSDN" };
std::size_t const MyClass::m_cData = ARRAY_LENGTH(MyClass::m_data);

Имей в виду баг стандарта — конструкция sizeof(Class::member) не допускается. Хотя для статических членов может и работать, проверь.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.