Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2015, 04:07   #31
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Ответ на #26:
Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
без использования звездочки кнопка не создается
Она создается, но по окончанию функции вызывается ее деструктор и она пропадает.

Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
и компилятор ругается на попытку добавления объекта btn в список QList
QList содержит указатели на кнопки, <QPushButton*>, поэтому и ругается. В QList нужно добавлять указатель на кнопку:
Код:
buttonList.append(&btn);
Только это не освобождает от того, что кнопка пропадет по окончанию функции. Но зато мы будем знать, какой у нее был адрес в стеке
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 13.08.2015 в 04:10.
Krasiosoft вне форума Ответить с цитированием
Старый 13.08.2015, 04:33   #32
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Опять по указателям задаю глупые вопросы:

А что если писать так:
QList <QPushButton> btn ?

Цитата:
Она создается, но по окончанию функции вызывается ее деструктор и она пропадает.
Создается фигзнаетгде и по какому адресу, потому что не указан родитель, поэтому и вызывается деструктор? Или почему?

А как второй вариант из поста 26 переписать так, чтоб кнопка была создана и не удалялась на форме1 (пока на форме 1) ибо я даже вторую форму создавать в QT не научился

Цитата:
QList содержит указатели на кнопки
Пока только понял то, что в цикле от 0 до РазмерСписка-1 программа ищет указатель на начало объекта и работает с ним, потом при i++ программа в списке переходит на начало второго объекта и т.д., а работает-то она не с указателем *btn, а самим объектом btn?

В принципе, понял зачем <QPushButton*>, но вот не понятно многое с тем- зачем нужен указатель на функцию, почему бы просто не вызвать функцию... , ну да ладно, вопрос до второй цитаты важнее

В Си простейшее приложение пишется гораздо дольше чем в делфи, мне не понятно - почему Си так популярен, он ведь удобен для написания скетчей, и то упаришься... Уж сил нет на Си, то строку по пробелам на слова поделит, то еще что, пока до каждой мелочи не докопаешься - не поймешь, плюс кучу времени потеряешь, уж сил никаких нет . Думаю Java начать изучать, но говорят там больше половины от С++, так что без указателей не обойтись , даже не представляю-как СИшники не могут без указателей
from dark to light)

Последний раз редактировалось Алексей_2012; 13.08.2015 в 04:55.
Алексей_2012 вне форума Ответить с цитированием
Старый 13.08.2015, 05:02   #33
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
QList <QPushButton> btn
Должно работать, но я бы не советовал так делать.
Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
Создается фигзнаетгде и по какому адресу, потому что не указан родитель, поэтому и вызывается деструктор? Или почему?
Нет, просто классы (не указатели на классы), объявленные в теле функции, точно так же как и другие переменные, находятся в стеке. А по окончанию функции для классов идет вызов деструктора, чтоб была освобождена память, которую они могли выделять для себя.
Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
А как второй вариант из поста 26 переписать так, чтоб кнопка была создана и не удалялась на форме1
Если нужно создавать динамически кнопки, то делайте это как в первом варианте.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 13.08.2015 в 05:05.
Krasiosoft вне форума Ответить с цитированием
Старый 13.08.2015, 10:11   #34
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
МойКласс new_obj;
МойКласс *new_obj;
Не верно во-втором случае.
В первом, Вы создаёте переменную, с типом Вашего класса. Во-втором, нужно писАть так:
Код:
МойКласс  = new *new_obj;
В этом случае, получаем указатель на объект new_obj с выделением памяти, ровно столько, сколько необходимо в данном, конкретном случае. Можно воспользоваться функциями malloc и alloc. Но сдесь есть "камень приткновения". Вы точно должны знать, что объект не выйдет за границы выделенного сегмента. И второй "камень", выделяя место, больше чем нужно, получите "утечку памяти" т.е. неоправданный её перерасход (а её, блин, всегда мало ИМХО). Собственно, оператор new, для того и придуман, что-бы устранить эти две проблемы.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.08.2015, 03:52   #35
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Есть еще вопрос . Что лучше...

Код:
#include <fstream>

Ifstream f;
Или 
Ifstream *f;
Применимы ли fprintf для первого варианта?
from dark to light)

Последний раз редактировалось Алексей_2012; 14.08.2015 в 03:55.
Алексей_2012 вне форума Ответить с цитированием
Старый 14.08.2015, 04:00   #36
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

ifstream - это класс.

При объявлении указателя:
Код:
ifstream *f;
Вы не сможете использовать его, пока не создадите экземпляр этого класса с помощью new.

А какое отношение у fprintf к ifstream?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 14.08.2015, 18:21   #37
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Дело в том, что я пытаюсь переписать наш стандартный подход к заполнению файла на то, чтоб использовался указатель, вот код который пытался переделать, работает как надо, хоть и cin.ignore() меня смущает.

Код:
#include <fstream>
#include <iostream>

using namespace std;
int main()
{  int count=0;

    cout<<"Print count std: ";
    cin>>count;
    cin.ignore();

    ofstream my_file("d://file.txt");

    for (int i(1);i<=count;i++)
        my_file<<i<<endl;
    my_file.close();

    return 0;
}

Вот тот же вариант, но пытаюсь применить указатель.

c frintf и fscanf пытался разобраться без форума, но не получилось

Код:
#include <fstream>
#include <iostream>

using namespace std;
int main()
{  int count=0;

    cout<<"Print count std: ";
    cin>>count;
    cin.ignore();

    ofstream *my_file;
    my_file=new ofstream("File1.txt");

    for (int i(1);i<=count;i++)
       fprintf(my_file,i);

    my_file.close();

    delete my_file;
    return 0;
}
и еще, как в первом варианте программы, например, перед закрытием файла установить курсор на его начало на случай если например сделать не один цикл ввода данных, а два, т.е. чтоб перезаписать данные другие и уже потом закрыть файл. в общем нужен аналог seek, пытался разобраться с СИшными seekg..., опять какая-то жуть, видать нужно смотреть в сторону указателей, чтоб адресоваться в файле.
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 14.08.2015, 19:37   #38
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

С приминением указателя на ofstream:

Код:
#include <fstream>
#include <iostream>

using namespace std;
int main()
{  int count=0;

    cout<<"Print count std: ";
    cin>>count;
    cin.ignore();

    ofstream *my_file = new ofstream("d://file.txt");

    for (int i(1);i<=count;i++)
        (*my_file)<<i<<endl;  //  или my_file[0]<<i<<endl;

    my_file->close();

    delete my_file;
    return 0;
}
my_file->tellp() - взять текущую позицию.

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

Последний раз редактировалось Krasiosoft; 14.08.2015 в 19:43.
Krasiosoft вне форума Ответить с цитированием
Старый 14.08.2015, 19:53   #39
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Т.е. операция взятия индекса применима и к указателям на поток, объект и т.д.? А вот чем <<, >> Лучше fscanf и fprintf? В вашем коде последние два не применимы?

Чем вариант с-указателем лучшее моего рабочего варианта и лучше ли вообще?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 14.08.2015, 20:26   #40
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

ofstream - это класс потока для осуществления операций вывода с файла.
ifstream - это класс потока для осуществления операций ввода в файл.

fscanf и fprintf - это методы Си, для них нужно открывать файл с помощью fopen.

И операции "<<", ">>" не нужно принимать за что-то особое, это обычные операции, как и "+", "-", "/", "*" и т.п.

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

Последний раз редактировалось Krasiosoft; 14.08.2015 в 20:34.
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указатели salmon172 Паскаль, Turbo Pascal, PascalABC.NET 0 31.05.2011 21:34
указатели Артэс Общие вопросы C/C++ 4 07.09.2010 11:08
Указатели Анютик_sexi Помощь студентам 3 16.06.2010 14:38
Указатели AquaticSoul Общие вопросы C/C++ 5 22.12.2009 15:13
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39