Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > динамическая размерность классов


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

Код

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 не предлагать.

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

так нельзя. Для определения длины строки ты должен писать функцию, которая будет выдавать эту длину. sizeof не для этого

Автор: Prehistorik 25.9.2007, 12:53
Код

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();
}


не катит?!

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

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

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

вот класс

Код

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 видел мой класс как размер строки и всё, ну как стринг, понимаете? вот тут трабла
 



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

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

Автор: Syberex 25.9.2007, 13:06
Цитата(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 

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

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


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

все равно нельзя smile

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

Автор: zkv 25.9.2007, 13:36
Цитата(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 используешь

Автор: Fazil6 25.9.2007, 15:04
Syberex, то что ты хочешь сделать возможно только перегрузив оператор sizeof , но перегружать его религия не позволяет, поэтому вообще это невозможно. Но даже если такое было бы возможно, то твои колеги оторвали бы тебе руки за такое использование sizeof. Этим оператором узнают размер самого объекта, а не того чем этот объект владеет. И твои переменные, которые входят в объект определяют его размер и скрывать их от sizeof , мягко говоря, идиотизм. 

Автор: bsa 25.9.2007, 16:46
Если я не ошибаюсь, значение sizeof определяется уже на этапе компиляции.

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

да, точно  smile 
 но я даже не пытался задуматься над этой задачей smile

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

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

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

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)