Есть класс, в заголовке которого есть примерно следующее содержание:
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.
если честно, то дальше я встал в тупик...

есть у кого-нибудь какие-либо соображения о том, как можно достучаться до массивов так, чтобы можно было получить их размер, не добавляя функциональности в базовый класс???
Здравствуйте, 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) не допускается. Хотя для статических членов может и работать, проверь.