Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > динамическая размерность классов |
Автор: Syberex 25.9.2007, 12:44 | ||
вот написал класс свой стринговый пашет чюдестно, только вод одна трабла, как убрать из области видимости переменные которые определены в классе и влияют на его размер. вот начало кода класса
MyString StrWord; sizeof(StrWord) выдаёт кучу байтов включая int -егиты всякие, а мне всеголишь нужно чтоб выдавал размер класса как размер строки char * str ; // указатель на массив Char, как в классе string,ведь там тоже ведь есть переменные в классе, но sizeof их не видит. P.s вынести переменные за класс и переписать sizeof не предлагать. |
Автор: Prehistorik 25.9.2007, 12:53 | ||
не катит?! |
Автор: Fazil6 25.9.2007, 12:55 | ||
в каком string ? sizeof выдаст размер объекта типа string, но не длину строки, которую он хранит |
Автор: Syberex 25.9.2007, 13:01 | ||||
блин, не правильно поняли, у меня есть функция которая возвращает длину строки, мне не это нужно, вот класс
а теперь объявляя структуру с использованием моего класса
и когда с делать sizeof MyString аWord; в размер входят из моего класса и другие переменные класса, мне это не нужно, хочу чтоб sizeof видел мой класс как размер строки и всё, ну как стринг, понимаете? вот тут трабла |
Автор: zkv 25.9.2007, 13:05 | ||
даже если так можно сделать, то делать так не нужно... |
Автор: Syberex 25.9.2007, 13:06 | ||||||||
эт я понимаю, резервирует размер памяти, мне это и нужно что видел какой размер массива выделен и всё Добавлено через 2 минуты и 42 секунды
а если очень хочется ![]() |
Автор: zkv 25.9.2007, 13:10 | ||
Syberex, тебе уже сказали, что sizeof показывает размер объекта класса, смотри:
Добавлено через 1 минуту и 9 секунд все равно нельзя ![]() |
Автор: Syberex 25.9.2007, 13:21 |
ну как это нельзя , не понимаю , если я захочу записать в файл структура с ипользованием моего класса, то зачем мне сохронять остальные переменные класса? вот я и хочу убрать из области видимости лишние переменные и сделать ну может функцию перегрузки возврата размера, потому что скажем FILE * R; тоже попытаеться записать все переменные в файл. |
Автор: zkv 25.9.2007, 13:36 | ||||
Syberex, такие вещи как sizeof должны вести себя предсказуемо. а сохранение можно сделать и по человечески, например написать методы для загрузки и сохранения объекта... Добавлено через 1 минуту и 22 секунды
Добавлено через 3 минуты и 6 секунд или перегрузить операторы >> и << для std::istream/ostream, если iostream используешь |
Автор: Fazil6 25.9.2007, 15:04 |
Syberex, то что ты хочешь сделать возможно только перегрузив оператор sizeof , но перегружать его религия не позволяет, поэтому вообще это невозможно. Но даже если такое было бы возможно, то твои колеги оторвали бы тебе руки за такое использование sizeof. Этим оператором узнают размер самого объекта, а не того чем этот объект владеет. И твои переменные, которые входят в объект определяют его размер и скрывать их от sizeof , мягко говоря, идиотизм. |
Автор: bsa 25.9.2007, 16:46 |
Если я не ошибаюсь, значение sizeof определяется уже на этапе компиляции. |
Автор: zkv 25.9.2007, 16:48 |
да, точно ![]() но я даже не пытался задуматься над этой задачей ![]() |
Автор: Earnest 25.9.2007, 17:21 | ||
Ты, видимо, хочешь сохранить только адрес своей строки char* и потом круто радоваться при чтении? ![]() ![]() ![]() В любом случае, как уже было сказано, для сериализации классов (которые не POD) нужно писать конкретные функции - нельзя обойтись write (ptr, size). А раз так - какая разница, что в классе хранится? Сериализуй, что хочешь... А что касается string - действительно, некоторые реализации дают sizeof == 4, т.е. там только указатель. Но это вовсе не указатель на строку - сначала там длина, потом, возможно , что-то еще, и только потом строка. А MFC поступает вообще через ... Размер CString тоже 4, и мы отладчиком видим указатель прямо на строку. Только вот реальный выделяемый буфер начинается чуть раньше, и там содержится служебная информация, а в объект записывается сдвинутый указатель, прямо на строку ... |