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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация свойств объекта, ...или я туплю... 
:(
    Опции темы
Гость_Alexey
  Дата 13.3.2005, 19:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Сразу: пишу в VC++ 6. В общем есть некоторый класс (таблица) и в нем заданы некоторые свойства, ну допустим:
Код

class table {

    // parameters
    ROW* DB;
    ROW temp;
        int sz;
        ///
        /// Куча разных методов...
        ///
public:
    table(int count);
    ~table();
} TABLE;

ROW здесь это за-typedef-енный тип структуры (строка таблицы), содержащей определенные поля (скажем, для простоты, что все поля int-овые). В конструкторе объекта создается массив строк таблицы в количестве count. После создания объекта при инициализации полей (в контрукторе обращаюсь к полям через this->DB[индекс].поле и делаю присваивание) выдается Access violation. Чертовщина какая-то... Как бы его отследить и выловить?

ЗЫ - сразу извиняюсь, если вопрос покажется ламерским, потому что я только начинаю прогать в области ООП smile
  Вверх
bel_nikita
Дата 13.3.2005, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Хотелось бы увидеть сам конструктор


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Гость_Alexey
Дата 14.3.2005, 05:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да, пожалуйста.
Код

table::table(int count) {
    this->sz=count;  // этот параметр содержит количество строк
    ROW* DB = new ROW [this->sz];
    this->init();  // здесь вызывается инициализация
}

Инициализация:
Код

void table::init() {
    int m;
    for(m=0; m<this->sz; m++) {
        this->DB[m].key=0;
        this->DB[m].id=m;
        this->DB[m].index=0;
        this->DB[m].ret.tm_hour=0;
        this->DB[m].ret.tm_isdst=0;
        this->DB[m].ret.tm_mday=0;
        this->DB[m].ret.tm_min=0;
        this->DB[m].ret.tm_mon=0;
        this->DB[m].ret.tm_sec=0;
        this->DB[m].ret.tm_wday=0;
        this->DB[m].ret.tm_yday=0;
        this->DB[m].ret.tm_year=0;
        *(this->DB[m].book)=0;
        *(this->DB[m].name)=0;
        *(this->DB[m].secn)=0;
        *(this->DB[m].surn)=0;
    }
}

Полагаю, тогда и структуры придется расписать для наглядности.
Код

    typedef struct date {
        int tm_sec;  
        int tm_min;   
        int tm_hour;  
        int tm_mday; 
        int tm_mon;    
        int tm_year;   
        int tm_wday;   
        int tm_yday;   
        int tm_isdst;   
    } DATE;

    typedef struct row {
    int key; // keynum
    char surn[80]; // surname
    char name[80]; // name
    char secn[80]; // secname
    int id; // ticketid
    char book[80]; // book
    int index; // index
    DATE ret; // date
    } ROW;

  Вверх
Да гость я...
Дата 14.3.2005, 06:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Сразу скажу, что только бегло просмотрел код. Ряд тривиальных рекомендаций:

1) Нет необходимости явно использовать this. Компайлер за Вас сам это сделает.
2) Вместо struct date я бы использовал тип time_t (что есть просто typedef unsigned long time_t). Во-первых, в 9 раз меньше места занимает, чем у Вас, а во-вторых, имеется полный набор CRT ф-ций для манипуляции с данными этого типа. Если уж так хочется, то можно написать класс-обертку, методы к-рого позволяют а) проиницилизировать переменную time_t и б) получить все нужные вам значения как-то year, month, date etc. Реализация может быть примерно такой:

Код

class CWTime // W - for wrapper 
{
  time_t  m_time;
public:
  CWTime() 
  {
      m_time= time(0); // текущее сист. время
  }
  
  int Year   () { return (GetLocalTm()->tm_year + 1900);  }
  int Month() { return (GetLocalTm()->tm_mon + 1);  }
  int Day   (); 
  . . . 
  bool IsDst(); 

private:
  // хэлпер-метод
   tm * GetLocalTm() { return localtime( &m_time);  }
};


Хотя есть ещё более простое решение: в БД хранить time_t, а для вместо указанного выше CWTime - использовать MFС/ATL класс - CTime. Для VC6 это класс MFC, а для VC7 - ещё и ATL. Один из конструкторов CTime принимает time_t, а набор его методов более, чем достаточный.

ЗЫ: по поводу классов для работы с БД, почему Вам CDaoRecordset не подходит?
  Вверх
Да гость я...
Дата 14.3.2005, 06:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну, просмотрел код

Код

class table {

    ROW* DB; // это атрибут класса
 . . .
};

table::table(int count) 
{
    this->sz=count; 
    ROW* DB = new ROW [this->sz]; // А это локальная переменная, маскирующая атрибут
. . .
}

Итак, атрибут класса ROW* DB так и остался неинициализированным.

ЗЫ: хоть и ругают венгерскую нотацию, но я лично "m_" для членов класса всегда юзаю. И мне не нравятся более новомодные варианты обозначений вроде atribute_ или _atribute.
  Вверх
Гость_Alexey
Дата 14.3.2005, 12:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибки, кажется до меня таки дошло в чем дело =) Жалко что мы гости, так бы авторитет поднял =)
Цитата
по поводу классов для работы с БД, почему Вам CDaoRecordset не подходит?

Потому что это задание для универа. Сначала пишем управление строками, таблицами, потом выше и выше по иерархии. Если бы не надо было это ручками писать, конечно бы запользовал готовый класс.
  Вверх
Гость_Alexey
Дата 14.3.2005, 12:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Браво! Все заработало, стоило только заменить в конструкторе
Код

ROW* DB = new ROW [this->sz];

на
Код

this->DB = new ROW [this->sz];

smile
  Вверх
Guest
Дата 14.3.2005, 23:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Гость_Alexey
Все-таки полезно юзать "m_" для имен членов класса - описка сразу была бы заметна.

Цитата
Жалко что мы гости, так бы авторитет поднял =)

Придется зарегистрироваться... smile
  Вверх
Vyacheslav
Дата 3.6.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
ЗЫ: хоть и ругают венгерскую нотацию, но я лично "m_" для членов класса всегда юзаю. И мне не нравятся более новомодные варианты обозначений вроде atribute_ или _atribute.

А разве m_ относится к венгерская нотации? Это просто соглашения, принятые MS


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Любитель
Дата 7.6.2005, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Относятся. Просто мелкософт принял венгрескую нотацию. smile


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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