Ребята, У меня к вам вопрос по поводу книг. Хочу изучить Visua C++ 6 но незнаю какую книгу взять. Покупать что то о че потом пожелеешь тоже не хочется. Я уже прочитал Дейтела С++(третье издание) и теперь как бы хочется еще visual c++ для полного комплекта. Подскажите хорошую книгу. Спасибо.
Приветствую Вас, Игорь! Лучше MSDN нет ничего! Ответ отправлен: 02.06.2004, 09:37 Отправитель: Sedric Отвечает CrackLab
Здравствуйте, Игорь! Я видел 3 книги по Visual C++, но никакая из них мне не понравилась, ну на 4- может быть потянет вот эта книжка: Дэвис Чепмен "Освой самостоятельно VisualC++ .NET за 21 день"
Ответ отправлен: 01.06.2004, 22:09 Отправитель: CrackLab
Вопрос № 1668
Здравствуйте эксперты Как работать с базами DAO? А конкретно: от каких внешних файлов зависит приложениние используещее классы CDaoDatabase и CDaoRecordset. А я написал прогу с испоьзованием этих классов, прога у меня пашет, а на других машинах, при запуске выдает - "Не удается инициализировать DAO/Jet обработчик баз данных"че это за шляпа, и как с этим боротся? И еще давно хочу узнать есть ли книга или какой нить мануал типа: "Visual C++ и базы данных от А до Я", где все подробно расписано. Заранее благодарен. Абрамовский Иван.
Добрый день, Абрамовский Иван! смотри HKEY_CLASSES_ROOT\TypeLib\{00025E01-0000-0000-C000-000000000046} Ответ отправлен: 02.06.2004, 06:07 Отправитель: bocha
Вопрос № 1669
Здравствуйте Эксперты!Если нужно считать текст из файла ,то как то нужно ли в конце файла ставить точку,end и т.д. или EOF(конец файла)определяеться автоматически
Приветствую Вас, Алексей! Не совсем понял вопрос, но суть чтения из файла таков: читаешь пока читается. Ответ отправлен: 02.06.2004, 08:44 Отправитель: vitya Отвечает CrackLab
Здравствуйте, Алексей! Есть функция eof которая возвращает true или false в зависимости от того, достигнут ли конец файла или нет. Обычно используют такую конструкцию: while (!eof(filehandle)) { // Ваши действия } Или же можете получить размер файла и контролировать чтение из файла с учетом размера файла. Ответ отправлен: 01.06.2004, 23:02 Отправитель: CrackLab Отвечает barsik
Приветствую Вас, Алексей определяеться автоматически
Ответ отправлен: 03.06.2004, 00:22 Отправитель: barsik
Вопрос № 1670
Здравствуйте эксперты. Вот получил ответ от эксперта bocha: HKEY_CLASSES_ROOTTypeLib{00025E01-0000-0000-C000-000000000046} А можно подробнее че это такое, и как это сделать? Заранее благодарен за ответ(ы) Абрамовский Иван.
Добрый день, Абрамовский Иван! посмотри у себя ключ реестра HKEY_CLASSES_ROOT\TypeLib\{00025E01-0000-0000-C000-000000000046} , в нем прописаны библиотеки DAO Ответ отправлен: 03.06.2004, 05:57 Отправитель: bocha
Вопрос № 1671
Доброго здоровья :) У меня 2 вопроса (в порядке уменьшения значимости): 1. Возможно ли при создании массива указателей на класс с помощью new (напр. см. прил.) определённой переменной задавать разные значения, которые по определённому алгоритму выбирал бы сам конструктор (сам алгоритм не принципиален - это может быть и проостой инкремент для int). Я в одной книжке (не моей к сожалению) читал, что в определении класса можно записать что-то вроде ... operator new[](...), но что конкретно там писать я не помню. Т.е. нужно, что бы конструктор сам присваивал этой переменной значение. 2. Может быть кто-то из вас знает (пользуется) редактором, который бы мог делать всё тоже самое что и стандартная борландовская ИДЕшка (я имею ввиду ИДЕ от Си-Билдера), но к которой можно было бы без лишнего гемора подключать к.-либо другие библиотеки. Под словами "без
лишнего гемора" следует понимать, что я в настройках прорписываю какие библиотеки нужно линковать всегда. Ну и уж совсем было бы круто, что б ентот редактор позволял сохранять различные профили для этих самых библиотек, а при создании нового проекта спрашивал какой профиль я хочу использовать. Это нуно, например, если я хочу поюзать разные GUI-библиотечки (OWL, wxWindows, etc.) или ещё что-нибудь в этом роде.
Доброе время суток, h@Lt! //1// /*конструкторы для того и существуют, чтобы присваивать начальные значения перегружать операторы new и new[], конечно можно, но в большинстве задач в этом нет необходимости для того, чтобы пользоваться оператором new[], класс должен иметь открытый конструктор без аргументов, если не объявлять конструкторы вообще, то компилятор автоматически создает конструктор по умолчанию, и объекты можно будет создавать оператором new[], однако если создать хоть один конструктор, то конструктор по умолчанию будет отдыхать для вашей задачи можно сделать например так:*/ //
class TMyClass{ static int gen_id;//она общая для всех экземпляров const int ID; int my_data; public: TMyClass():ID(gen_id++), my_data(gen_id){ cout << ' ' << my_data; } }; int TMyClass::gen_id=0;//
/*теперь
у каждого созданного экземпляра класса будет свое уникальное (в рамках исполняемой программы) знечение ID, и никакой перегрзки операторов new
*/ int main() { TMyClass **p = new TMyClass*[100];/*создается масив указателей значение gen_id как было равно нулю, так и осталось равно нулю, Вы,похоже, несколько путаете указатель на массив и массив указателей. В случае создания массива указателей никаких объектов автоматически не создается, да и употребляемый вами термин "указатель на класс", по моему, не корректен*/ TMyClass *o = new TMyClass[100];/*а вот тут создается массив объектов, со значениями ID от 0 до 99 и в последствии при генерации объектов данного типа их ID будут начинаться со 100*/ TMyClass t = o[1];/*а вот тут заложена мина т.к. небыло создано
конструктора копий, то используется конструктор по умолчанию gen_id не увеличивается, и используется побитовое копирование и t.ID будет равно 1, ID теряет уникальность. Для большинства случаев, при создании нового экземпляра подобного класса, это не то, что нужно. Как правило необходимо копирование данных, содержащихся в других полях класса, а уникальный ID, должен оставаться уникальным, поэтому конструктор копий TMyClass(const TMyClass& t) т.ж. необходимо перегружать, либо объявлять его как закрытый перегрузить его в даном случае можно например так: TmyClass::TMyClass(const TMyClass& t):ID(gen_id++), my_data(t.my_data){} Еще одна мина в отсутствие перегруженого оператора присваивания, который в данном случае очевидно должен иметь вид TMyClass& TMyClass::operator=(const TMyClass& t){my_data = t.my_data;} или быть объявлен закрытым иначе
компилятор как и в случае с конструктором копий предоставит свой, и сделает не так как Вы хотели, и в следующей строке ID опять теряет свою уникальность*/ p[0] = p[3];//p[0].ID == 3 а не 0 delete[] o; cout << endl << endl; for(int i =0; i < 100;i++){//ну коль создали массив указателей, его необходимо как-то использоать p[i] = new TMyClass[i+1];//каждый указатель указывает на массив из i+1 экземпляров TMyClass cout << endl; } for(i=0; i < 100; i++) delete[] p[i];//не забывайте уничтожать все объекты после их создания оператором new delete[] p; return 0; }//
//2// /*С билдером я почти не знаком, т.к. среда слишком тяжела и глючна (одному моему знакомому, в прошлом году пришлось работать с VC6SE на 486+16+вынь95, правда, при сборке-отладке комп тормозил, а о работе под музыку пришлось на время забыть и MSDN ставить
вручную, попробуй с билдером на такую конфигурацию залезть, так, что при упоминании о билдере мне теперь всегда вспоминается анекдот "Батьку, и у кринку нэ лезэ!!!"), но, по-моему, там (в билдере) можно создавать собственные шаблоны проекта, в которых, в том числе, указываются и подключаемые по умолчанию для данного шаблона библиотеки*/ Ответ отправлен: 03.06.2004, 16:33 Отправитель: bocha Отвечает CrackLab
Приветствую Вас, h@Lt! По поводу первого вопроса. Вообще невозможно инициализировать динамически создаваемый массив объектов. Но вы можете создать конструктор без параметров, который будет решать какие начальные значения установить создаваемому объекту. Вот пример с инкрементом: int globalvar = 0; class TMyClass { public: int i; __fastcall TMyClass() { i = globalvar; globalvar++; }; }; и потом: TMyClass *foo = new TMyClass[3]; Теперь у нас будет 3 объекта, значения i которых будут соотвественно равны 0, 1 и 2. Ответ отправлен: 02.06.2004, 15:42 Отправитель: CrackLab
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.