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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно организовать конструктор, с параметрами 
:(
    Опции темы
oper54
  Дата 14.9.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть класс типа
могут быть не точности, пишу с головы
Код

#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));    
  }
...

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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



всегда думал что memcpy() имеет три параметра... ( это я про конструктор с параметрами )
+ что именно в нем не работает?

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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Дрон
Дата 14.9.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



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

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


--------------------
Да. Именно так.
PM   Вверх
oper54
Дата 15.9.2005, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
классы копировать нельзя -- никто не гарантирует что все данные класса расположены в одном месте и последовательно.

_hunter да хоть и не классы, это я в примере так написал (буду знать теперь что классы нельзя копировать), а про memcpy я знаю что три параметра(опечатка).
Дрон неработка в том что он вываливается по assert... собственно это и стало причиной создания топика, как я уже говорил create то работает... smile
PM MAIL   Вверх
Дрон
Дата 15.9.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



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

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


--------------------
Да. Именно так.
PM   Вверх
Vyacheslav
Дата 16.9.2005, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ничего себе правильный!
Код

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

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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
oper54
Дата 16.9.2005, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Vyacheslav вот это я и хотел узнать.... А как же мне тогда поступить?
Vyacheslav кстати я не говорил что класс написан правильно, имеено по тому что не знаю как должно быть правильно.
Добавлено @ 16:27
Vyacheslav выделить память прямо в конструкоре с параметрами, а остальное остается таким же?
PM MAIL   Вверх
_hunter
Дата 16.9.2005, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



вынеси код инициализации в приватную функцию и вызывай ее из конструкторов...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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