Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> динамическая размерность классов, убрать из области видимости размер перем 
V
    Опции темы
Syberex
Дата 25.9.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



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

Код

class MyString
 {
  //закрытые члены класса
private:
    
    char  * str ; // указатель на массив Char
    int  len;  // размерность массива Char
    static int num_string; // количество объектов  // только одна копия переменной
    static const int CINLIM=80; // ввод границы cin
  // открытые члены класса
public:
     //конструкторы и другие методы
     MyString(const char *s); // явный конструктор


MyString StrWord;
sizeof(StrWord)           выдаёт кучу байтов включая int -егиты всякие,

а мне всеголишь нужно чтоб выдавал размер класса как размер строки char  * str ; // указатель на массив Char, как в классе string,ведь там тоже ведь есть переменные в классе, но sizeof их не видит.

P.s  вынести переменные за класс и переписать sizeof не предлагать.

--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Fazil6
Дата 25.9.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Syberex @  25.9.2007,  12:44 Найти цитируемый пост)
а мне всеголишь нужно чтоб выдавал размер класса как размер строки char  * str ;

так нельзя. Для определения длины строки ты должен писать функцию, которая будет выдавать эту длину. sizeof не для этого
PM MAIL   Вверх
Prehistorik
Дата 25.9.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 30.5.2006
Где: СПб

Репутация: 1
Всего: 3



Код

class MyString
 {
  //закрытые члены класса
private:
    
    char  * str ; // указатель на массив Char
    int  len;  // размерность массива Char
    static int num_string; // количество объектов  // только одна копия переменной
    static const int CINLIM=80; // ввод границы cin
  // открытые члены класса
public:
     //конструкторы и другие методы
     MyString(const char *s); // явный конструктор
     


      int Length();
}


не катит?!
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
Fazil6
Дата 25.9.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Syberex @  25.9.2007,  12:44 Найти цитируемый пост)
 как в классе string,ведь там тоже ведь есть переменные в классе, но sizeof их не видит

в каком string ?
sizeof выдаст размер объекта типа string, но не длину строки, которую он хранит 
PM MAIL   Вверх
Syberex
Дата 25.9.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



блин, не правильно поняли, у меня есть функция которая возвращает длину строки, мне не это нужно,

вот класс

Код

class MyString
 {
  //закрытые члены класса
private:
    
    char  * str ; // указатель на массив Char
    int  len;  // размерность массива Char
    static int num_string; // количество объектов  // только одна копия переменной
    static const int CINLIM=80; // ввод границы cin
  // открытые члены класса
public:
     //конструкторы и другие методы
     MyString(const char *s); // явный конструктор
     MyString::MyString(const int unsigned Array);
     MyString();  // конструктор класса по умолчанию
     ~MyString();   // деструктор класса
     MyString(const MyString & ); // конструктор глубокого копирования
     int length () const { return len; };

     
  //перегруженные методы оператора
  MyString & operator=(const MyString &);
  MyString & operator=(const char * );
  MyString & MyString::operator=(const string s);
  char & operator[] (int i);
  const char & operator[] (int i) const;

  //перегруженные дружественные функция
  friend bool operator<(const MyString & st, const MyString  & st2);
  friend bool operator>(const MyString & st1, const MyString & st2);
  friend bool operator==(const MyString & st, const MyString & st2);

  friend ostream & operator<<(ostream & os,const MyString & st);
  friend istream & operator>>(istream & is,MyString & st);

  //статическая функция
  static int HowMany();

  char * MyString::CHAR_UKAZ();  

 };



а теперь объявляя структуру с использованием моего класса


Код

//MyString word;
struct Danni
 {
     MyString word;
     unsigned short int perception;
     unsigned short int sensation;
     unsigned short int presentation;
     unsigned short int priority;
 };

Danni *aWord=new Danni[200];


и когда с делать sizeof   MyString  аWord; в размер входят из моего класса и другие переменные класса, мне это не нужно, хочу чтоб sizeof видел мой класс как размер строки и всё, ну как стринг, понимаете? вот тут трабла
 




Это сообщение отредактировал(а) Syberex - 25.9.2007, 13:02
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
zkv
Дата 25.9.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Syberex @  25.9.2007,  13:01 Найти цитируемый пост)
и когда с делать sizeof   MyString  аWord; в размер входят из моего класса и другие переменные класса, мне это не нужно, хочу чтоб sizeof видел мой класс как размер строки и всё

даже если так можно сделать, то делать так не нужно...
PM MAIL   Вверх
Syberex
Дата 25.9.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(Fazil6 @ 25.9.2007,  12:55)
Цитата(Syberex @  25.9.2007,  12:44 Найти цитируемый пост)
 как в классе string,ведь там тоже ведь есть переменные в классе, но sizeof их не видит

в каком string ?
sizeof выдаст размер объекта типа string, но не длину строки, которую он хранит

эт я понимаю, резервирует размер памяти, мне это и нужно что видел какой размер массива выделен и всё

Добавлено через 2 минуты и 42 секунды
Цитата(zkv @ 25.9.2007,  13:05)
Цитата(Syberex @  25.9.2007,  13:01 Найти цитируемый пост)
и когда с делать sizeof   MyString  аWord; в размер входят из моего класса и другие переменные класса, мне это не нужно, хочу чтоб sizeof видел мой класс как размер строки и всё

даже если так можно сделать, то делать так не нужно...

а если очень хочется  smile 
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
zkv
Дата 25.9.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Syberex, тебе уже сказали, что sizeof показывает размер объекта класса, смотри:
Код

char *str = new char[100];
std::cout<<sizeof( str );    //на большинстве платформ выдаст 4 - размер указателя.


Добавлено через 1 минуту и 9 секунд
Цитата(Syberex @  25.9.2007,  13:06 Найти цитируемый пост)
а если очень хочется 

все равно нельзя smile
PM MAIL   Вверх
Syberex
Дата 25.9.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



ну как это нельзя , не понимаю , если я захочу записать в файл структура с ипользованием моего класса, то зачем мне сохронять остальные переменные класса? вот я и хочу убрать из области видимости лишние переменные и сделать ну может функцию перегрузки возврата размера, потому что скажем FILE * R; тоже попытаеться записать все переменные в файл.
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
zkv
Дата 25.9.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Syberex @  25.9.2007,  13:21 Найти цитируемый пост)
ну как это нельзя , не понимаю , если я захочу записать в файл структура с ипользованием моего класса, то зачем мне сохронять остальные переменные класса? вот я и хочу убрать из области видимости лишние переменные и сделать ну может функцию перегрузки возврата размера, потому что скажем FILE * R; тоже попытаеться записать все переменные в файл. 

Syberex, такие вещи как sizeof должны вести себя предсказуемо.
а сохранение можно сделать и по человечески, например написать методы для загрузки и сохранения объекта...

Добавлено через 1 минуту и 22 секунды
Код

class MyString
 {
  //закрытые члены класса
private:
    
    char  * str ; // указатель на массив Char
    int  len;  // размерность массива Char
    static int num_string; // количество объектов  // только одна копия переменной
    static const int CINLIM=80; // ввод границы cin
  // открытые члены класса
public:
     //конструкторы и другие методы
     MyString(const char *s); // явный конструктор
    bool Save( FILE * );
    bool Load( FILE * );



Добавлено через 3 минуты и 6 секунд
или перегрузить операторы >> и << для std::istream/ostream, если iostream используешь
PM MAIL   Вверх
Fazil6
Дата 25.9.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Syberex, то что ты хочешь сделать возможно только перегрузив оператор sizeof , но перегружать его религия не позволяет, поэтому вообще это невозможно. Но даже если такое было бы возможно, то твои колеги оторвали бы тебе руки за такое использование sizeof. Этим оператором узнают размер самого объекта, а не того чем этот объект владеет. И твои переменные, которые входят в объект определяют его размер и скрывать их от sizeof , мягко говоря, идиотизм. 
PM MAIL   Вверх
bsa
Дата 25.9.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Если я не ошибаюсь, значение sizeof определяется уже на этапе компиляции.
PM   Вверх
zkv
Дата 25.9.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(bsa @  25.9.2007,  16:46 Найти цитируемый пост)
значение sizeof определяется уже на этапе компиляции. 

да, точно  smile 
 но я даже не пытался задуматься над этой задачей smile
PM MAIL   Вверх
Earnest
Дата 25.9.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Syberex @  25.9.2007,  14:21 Найти цитируемый пост)
если я захочу записать в файл структура с ипользованием моего класса, то зачем мне сохронять остальные переменные класса

Ты, видимо, хочешь сохранить только адрес своей строки char* и потом круто радоваться при чтении?  smile  smile  smile 

В любом случае, как уже было сказано, для сериализации классов (которые не POD) нужно писать конкретные функции - нельзя обойтись write (ptr, size). А раз так - какая разница, что в классе хранится? Сериализуй, что хочешь...

А что касается string - действительно, некоторые реализации дают sizeof == 4, т.е. там только указатель. Но это вовсе не указатель на строку - сначала там длина, потом, возможно , что-то еще, и только потом строка.
А MFC поступает вообще через ... Размер CString тоже 4, и мы отладчиком видим указатель прямо на строку. Только вот реальный выделяемый буфер начинается чуть раньше, и там содержится служебная информация, а в объект записывается сдвинутый указатель, прямо на строку ...




--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0877 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.