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


Автор: oper54 14.9.2005, 13:03
Есть класс типа
могут быть не точности, пишу с головы
Код

#include <windows.h>
#include <string.h>

typedef struct _S{
  //def constructor
  _S(){
    ssTextColor = 0xff00ff;
    ssBgColor   = 0x0000ff;
    memset(&ssLogFont, 0, sizeof(LOGFONT);
  }
  COLORREF ssTextColor;
  COLORREF ssBgColor;
  LOGFONT ssLogFont;
}STYLE, *PSTYLE;

class CStyle{
public:
  //def constructor
  CStyle(){
    pStyle = (PSTYLE)(malloc(sizeof(STYLE)));
  }
  //??????КОНСТРУКТОР С ПАРАМЕТРАМИ??????????
  CStyle(char* pszStyleName, PSTYLE pStyleStruct){
    CStyle();
    memcpy(pStyle, pStyleStruct);
    
    unsigned int len = strlen(pszStyleName);   
    
    pszName = new char[len + 1];
    strcpy(pszName, pszStyleName);
    pszName[len] = '\0';
  }
  
  void Create(char* pszStyleName, PSTYLE pStyleStruc){
    memcpy(pStyle, pStyleStruct);
    
    unsigned int len = strlen(pszStyleName);   
    
    pszName = new char[len + 1];
    strcpy(pszName, pszStyleName);
    pszName[len] = '\0';
  }
  ~CStyle(){free(pStyle); delete[] pszName;}
private:
  PSTYLE pStyle;
  char* pszName;
};

Вот... В классе еще куча всяких проверок чейчас это не существенно.
Конструктор с параметрами у меня не работает, тогда как метод Сreate - выполняеться и данные нормально копируются. Подскажите в чем моя ошибка, или может я вообще не правильно организовую весь класс.
Добавлено @ 13:10
Копирование тоже не работает
Код

...
  //copy constr
  CStyle(const CStyle& Style){
    if(this != &Style) memcpy(this, &Style, sizeof(CStyle));    
  }
...

Автор: _hunter 14.9.2005, 13:45
всегда думал что memcpy() имеет три параметра... ( это я про конструктор с параметрами )
+ что именно в нем не работает?

так:
memcpy(this, &Style, sizeof(CStyle));
классы копировать нельзя -- никто не гарантирует что все данные класса расположены в одном месте и последовательно.
нужно копировать все члены отдельно

Автор: Дрон 14.9.2005, 13:45
А в чём заключается "неработа" конструктора с параметрами. На вид, вроде, правильный.

А вот конструктор копирования у совершенно неправильный.

Автор: oper54 15.9.2005, 17:26
Цитата
классы копировать нельзя -- никто не гарантирует что все данные класса расположены в одном месте и последовательно.

_hunter да хоть и не классы, это я в примере так написал (буду знать теперь что классы нельзя копировать), а про memcpy я знаю что три параметра(опечатка).
Дрон неработка в том что он вываливается по assert... собственно это и стало причиной создания топика, как я уже говорил create то работает... smile

Автор: Дрон 15.9.2005, 17:36
Цитата(oper54 @ 15.9.2005, 18:26)
Дрон неработка в том что он вываливается по assert...

Так а где вываливается-то?

Автор: Vyacheslav 16.9.2005, 08:39
Ничего себе правильный!
Код

 CStyle(char* pszStyleName, PSTYLE pStyleStruct){
    CStyle(); //  WARNING
    memcpy(pStyle, pStyleStruct);
    
    unsigned int len = strlen(pszStyleName);   
    
    pszName = new char[len + 1];
    strcpy(pszName, pszStyleName);
    pszName[len] = '\0';
  } 


Если Вы полагаете, что вызовом CStyle() - производите инициализацию по умолчанию, то ошибаетесь. Такой вызвов означает, что в теле конструктора Вы создаете еще один экземпляр класса и тут же его уничтожаете.
Таким образом вот эта операция в конструкторе с параметром не выполняется для данного экземпляра класса
Код

 pStyle = (PSTYLE)(malloc(sizeof(STYLE)));

то есть память не выделяется

Автор: oper54 16.9.2005, 16:26
Vyacheslav вот это я и хотел узнать.... А как же мне тогда поступить?
Vyacheslav кстати я не говорил что класс написан правильно, имеено по тому что не знаю как должно быть правильно.
Добавлено @ 16:27
Vyacheslav выделить память прямо в конструкоре с параметрами, а остальное остается таким же?

Автор: _hunter 16.9.2005, 17:04
вынеси код инициализации в приватную функцию и вызывай ее из конструкторов...

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