Форум на Kuban.ru (http://forums.kuban.ru/)
-   Разработка программ (http://forums.kuban.ru/f1024/)
-   -   Что-то кисло у вас. Закидаем нуба помидорами! ;) (http://forums.kuban.ru/f1024/chto-_kislo_u_vas_zakidaem_nuba_pomidorami_%3B-7391880.html)

newNick 15.12.2015 20:55

Что-то кисло у вас. Закидаем нуба помидорами! ;)
 
В общем, занялся я тут изучением С++. Просто интересно стало. Читаю хорошую книгу, пока что самую понятную из всех, что я читал. Роберт Лафор(э). Объектно-ориентированное программирование. Всё круто структурировано в книге, поэтапно, с примерами. Короче, класс. Но! По ходу возникают вопросы, которые в книге не раскрываются и гугл не помогает. Ниже начну накидывать их, а вы, если не трудно, подскажите ламеру, что да как, окей? ;) Ну, флуд, естественно, приветствуется тут как нигде! )))
И так, помидоры, надеюсь, на готове? поехали! )))

newNick 15.12.2015 20:59

Вот пример из книги.

---------------------

// while4.cpp
// возведение в четвертую степень целых чисел #include <iostream>
#include <iomanip> // для setw
using namespace std;
int main()
**
int pow = 1; // первое возводимое число равно 1
int numb = 1; // 1 в 4-й степени равна 1
while(pow < 10000) // цикл, пока в степени не более 4 цифр
**
cout << setw(2) << numb; // вывод числа
cout << setw(5) << pow << endl; // и его 4-й степени ++numb; // инкремент текущего числа
pow = numb * numb * numb * numb; // вычисление 4-й степени
**
cout << endl; return 0;
**

--------------------

В начале были обозначены 2 переменные "pow" и "numb". Им было присвоено значение "1".
Важно ли тут это значение? То есть, если я просто обозначу "pow" и "numb" как переменные типа int, без присвоения какого-либо значения, будет ли всё работать? И для чего вообще в этом примере были присвоены значения "1"?

newNick 15.12.2015 21:08

И вот еще один вопрос. Использую среду Code Blocks. Есть такая функция exit(), которая относится к "директиве процессора" (если я правильно понял терминологию) #include <iomanip>. Короче, все программы, которые используются в книге в качестве примеров и в которых используется функция exit(), не работают. Код Блокс пишет внизу, что эта функция не определена и не относится ни к чему. Это проблема Код Блокс или что это за дрянь такая? :)

Vadim_ 15.12.2015 23:39

Тут не кисло, тут все давно умерло! Можешь глянуть на [url]http://www.sql.ru/forum[/url]

1)
Если переменные не проиницилизированны, то в зависимости от того что это за переменные и где они объявлены там в лучшем случае будет 0, а иначе некий мусор. Вот и представь как при этом отработает эта программа, например, если pow и numb будут изначально равны 0, или например, pow будет равен изначально 10000, сколько тогда циклов будет выполнено.

2) Читай хелп или гугли)
этот exit() нужен для завершения программы и возврата некого кода, например 0 если нет ошибок и чего-то отличного от 0, если есть. Внутри функции main вместо exit(n) можно использовать return n
И этот exit находится в stdlib

newNick 16.12.2015 07:35

3-Wake Me Up > спасибо, дружище. По первому что-то проясняется, но слабо. :) а по поводу exit, я так и поступил в итоге. Заменил на return и всё заработало.

newNick 21.12.2015 19:03

В общем, по мере прохождения джунглей С++ возник вопрос, касаемо функций. Сначала элементарный спрошу, потом, если не разберусь, еще раз спрошу! :) Пример

---------------------------------------

[b]void[/b] someFunc([b]int[/b]); // прототип функции

main
**
*****
someFunk(n) // вызов функции
return 0;
**

[b]void[/b] someFunc(n) // сама функция
**
****
// тело функции
return n;
**

---------------------------------------

main
**
[b]void[/b] someFunc([b]int[/b]); // прототип функции

*****
someFunk(n) // вызов функции
return 0;
**

[b]void[/b] someFunc(n) // сама функция
**
****
// тело функции
return n;
**


---------------------------------------

Разница, собственно, в том, что в первом примере прототип определяется ВСЕ функции main, а во втором случае ВНУТРИ функции main. Имеет ли это какое-то значение? Если прототип будет снаружи мейн, всё работает, я проверял. но не могу понять, почему в примере из учебника именно так. Там не пояснили. :(

newNick 21.12.2015 19:03

Фигурные скобки не отобразились. Чё за лажа*?

Vadim_ 22.12.2015 17:37

Какую-то странную книгу вы читаете. Нормально не расписано и еще учат плохому)
Про прототипы можете почитать это [url]http://cppstudio.com/post/404/[/url]
а затем это про неявное объявление функции
[url]https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D1%82%D0%B8%D0%BF_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8[/url]

Не знаю мне никогда не приходила идея объявить прототип функции внутри main ) Очевидно, разница будет в области видимости, если такое вообще сработает (на работе я использую довольно специфический C). Попробуйте между функциями main и someFunc написать функцию someFunc2, которая обращается к someFunc, а также добавьте вызов someFunc2 в main и прототип someFunc2 перед main и посмотрите как все это будет работать при объявлении прототипа someFunc перед функцией main и внутри main.
И да, не опускайте имена переменных в прототипе - так потом будет легче жить и вам и тем кто будет править ваш код после вас.

newNick 22.12.2015 20:09

А вот насчёт этих имён переменных вообще вопрос у меня серьёзный. Я, объявляя прототип, скажем, такой ф-ции

int someFunc(int);

и

int someFunc(int a);

эта самая "а" является переменной, видимой внутри только этой функции? Или же эта "а" должна уже быть объявлена в main, что бы someFunc с ней работала?
И еще разъясни пожалуйста,

int(возвращаемое?) someFunc(int(получаемое?) a)

То есть первое инт - это то, что функция должа вернуть? А внутри скобки - то, что должна получить, чтобы что-то с этой переменной "а" сделать внутри? Я правильно понимаю синтаксис?

Vadim_ 22.12.2015 22:09

8-newNick >Почитайте про область видимости, например, это [url]http://citforum.ru/programming/c/h16.shtml[/url]
а также про варианты передачи параметров в функцию, по значению, указателю, ссылке

max 26.12.2015 12:39

С++ ожил на этом форуме!!!
Слава Высшему Разуму! :)

newNick 26.12.2015 20:09

Правильно ли я понимаю, что конструктор класса является неким дефолтным значением для каждого нового объекта класса, который я создаю? То есть в конструкторе я указывю некоторые стартовые значия, от которых пойдет потом вся тема?

max 27.12.2015 10:55

8-newNick >11-newNick > чел, ты прикалываешься? :)

newNick 27.12.2015 12:26

12-Нас не забанить > Нет. А почему ты спрашиваешь?

max 27.12.2015 18:50

13-newNick > Вопросы сильно "наивные".
Ты до начала "изучения С++" программировал на чем-либо?
Такие элементарные вещи, как "область видимости", "параметры" и "возвращаемое значение" (в №8), много где есть, не только в С++.

max 27.12.2015 18:54

5-newNick > Нельзя объявлять прототип функции внутри другой функции.
Прототип нужен компилятору только в том случае, если определение функции идет либо после ее вызова (вниз по коду), либо оно вообще в другом модуле.

newNick 27.12.2015 20:06

14-Нас не забанить > Нет, до изучения С++ ни на чём не программировал, поэтому такие "элементарные" вещи и спрашиваю. Собственно, название темы говорит само за себя. Можешь закидать нуба помидорами. Если от этого тебе станет лучше, буду очень за тебя рад, честно. А если ответом дельным поможешь, то вообще +500 тебе в карму!

Я в курсе про сложность С++, про то, что лучше начинать с другого, что полегче, что "ногу при программировании на С++ можно отстрелить", уже понял, но начал с него, и перекидывать внимание на что-то другое пока не хочу. Ресурсов много где есть тоже знаю, но тут, вроде как, "роднее" что ли. Посему в гугл и на сайберфорум тоже посылать не надо. Формат "вопрос - ответ" намного информативнее и веселее :). Кто захочет ответить, ответит, нет, бросайте помидоры.

max 27.12.2015 20:13

16-newNick > Хорош тебе причитать про помидоры, не собираюсь я ничего ни в кого кидать. :)
Просто вопросов по С++ как бы ОЧЕНЬ много, но если совсем элементарные будешь спрашивать - жизни не хватит все тут объяснить. :)
Почитай книгу С++ для начинающих какую-нить, до ООП позже дойдешь. :)
Какой у тебя вопрос?

newNick 27.12.2015 22:38

Простыми словами про конструктор класса. Я так понял, что эта штука создана для того, что бы инициализировать объекты класса в момент их создания. То есть существует конструктор по умолчанию, который всем полям класса изначально присваивает 0. Так? А я могу создать еще конструктор, указав в нём предварительно поля класса, которые смогу в main указать при создании объекта класса. То есть верно ли утверждение, что конструктор класса образно можно назвать прототипом метода класса, не требующего написания тела?

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

max 27.12.2015 23:31

18-newNick >
1. [em]То есть существует конструктор по умолчанию, который всем полям класса изначально присваивает 0[/em]
Нет, в С++ такого нет явно, и тут есть некоторая путаница, к сожалению (из-за исторического наследия, возможно перфоманс и т.д.).
Точнее, конструктор по умолчанию есть, но он не для всех типов вызывается - например для встроенных типов (int, bool и т.п.) не вызывается. :)
Но для них можно его вызвать явно - тогда будет инициализация нулем.
2. [em]То есть верно ли утверждение, что конструктор класса образно можно назвать прототипом метода класса, не требующего написания тела?[/em]
Вот тут не понял. :)
Считай конструктор просто специальным методом, который вызывается при создании объекта. А написать в нем ты волен что угодно, но по умолчанию он мало что делает.

newNick 28.12.2015 08:07

19-Нас не забанить > спасибо. То есть конструктор будет именно конструктором до тех пор, пока я не начну писать тело. Инициализирую переменные именно как construct(int a, int b) : a(0), b(0) ****. Образно говоря...

max 28.12.2015 23:46

20-newNick > Да не, конструктор будет конструктором в любом случае (формально). :)
А вот что и как он будет делать - зависит от того, будешь ты его писать сам или нет. Если будешь - то уж все в твоих руках.

newNick 02.01.2016 08:35

Я вот чего не могу понять. Есть класс А и есть класс В. могу ли я создавать объекты класса В в привате класса А и применять к объектам класса В методы класса В? Я что-то бьюсь над этим, но ничего не работает. Короче, нужно внутри класса А работать с объетами класса В без всяких ограничений. Возможно?

newNick 02.01.2016 21:57

Возможно. Затупил, как обычно, на ровном месте. Все возможно, все работает. Разобрался.

maksss 08.01.2016 12:41

С объектами класса можно работать без ограничений из любого места через его [b]публичный[/b] интерфейс. :)

newNick 10.01.2016 00:43

24-Максыч > С объектами да, но я подумал, что проблемы возникли из-за того, что, получается, другой класс, как бы обращается в приват не свой. Оказывается, не так я понял как всё работает, но разобрался. Открыл для себя наследование классов и теперь вообще легче станет жить :)

Vadim_ 10.01.2016 15:32

25-newNick >Главное с наследованием не переборщить, а то потом фиг разберешься что там творится. Вообще после того как освоишь основы ООП рекомендую почитать книжку по паттернам.

newNick 10.01.2016 19:41

26-Wake Me Up > Спасибо. Почитаю.
Только вот по наследованию вопрос есть. Есть 2 варианта доступа к переменным родительского класса, точнее 2 варианта объявления, что ли. [b]private[/b] и [b]protected[/b]. Можете по-простому разъяснить что есть что? Потому как в одном примере из учебника всё работало только применяя способ протектед, а в другом примере и приват нормально себя вёл.

Vadim_ 11.01.2016 01:25

Если кратко:
Public — доступ открыт всем, кто видит определение данного класса.
Private — доступ открыт самому классу (т.е. функциям-членам данного класса) и друзьям (friend) данного класса, как функциям, так и классам.
Protected — доступ открыт классам, производным от данного.

newNick 12.01.2016 19:06

28-Wake Me Up > спасибо. То что надо ))
Слушайте, а ткните носом меня, где можно узнать больше о создании интерфейса. Хочу посмотреть хотя бы в общих чертах как это делается. Нет, не хотя бы, а на данный момент именно в общих чертах. Пока слышал только о qt, но мне интересно, а есть ли что-то более нативное, типа делфи, только плюсы :)

newNick 12.01.2016 19:12

Не, я понимаю, что есть гугл, но, может, вы уже изучали конкретные вещи и подкинете хороший ресурс по этой теме ;)

maksss 13.01.2016 23:21

29-newNick > Типа Дельфи был Borland Builder, но его уже кажется нет.
Да и под Винду сложные интерфейсы становится модным писать на WPF-ах всяких. Но там тоже "типа С++" можно использовать, managed.

Vadim_ 14.01.2016 00:34

31-Максыч >Добавлю что delphi как и bilder еще таки живы и развиваются
[url]https://www.embarcadero.com/ru/products/delphi[/url]
[url]https://www.embarcadero.com/ru/products/cbuilder[/url]

30-newNick >Еще есть wxWidgets, но Qt будет получше.

newNick 14.01.2016 16:16

Понятно. То есть вот как в делфи не получится в qt кнопочки на интерфейс кидать, верно? Я в ютубе посмотрел и так понял, что только код писать. На самом деле кажется, что не сложно. Как-нибудь поковыряю.

maksss 15.01.2016 08:33

33-newNick > По-моему, да.

newNick 16.01.2016 10:18

Слушайте, ребят, а рассккжите, где можно найти реальные задачи, которые решает программист. То есть, может существуют какие-нибудь проекты, над которыми любой желающий может потрудиться, внести свою лепту, так сказать. А это значит, что есть исходник в открытом доступе, который можно почитать, покумекать, внести изменения, потренироваться в этом во всём. Буду очень благодарен.

maksss 16.01.2016 12:01

35-newNick > Ты опять издеваешься? :))

newNick 16.01.2016 12:55

36-Максыч > А то!! )) не, дружище, вот я на данный момент работаю в сфере энергетики. Теплоэнергетика, если быть точнее. Я знаю где нарыть грамотных инженеров для получения ответов на свои вопросы. И если, например, кто-то из моих знакомых захочет как-то въехать в эту тему, я скажу ему к кому идти, дабы получить работу, знания и так далее, потому что я знаю. У меня в этой сфере знакомые в конце концов :)
Так же и по дизайну. Я 9 лет интерьеры делал, софтом владею, где и что купить знаю, кто где и как работает, сколько стоит и можно ди у этого человека чему научиться.
А в айти я вообще хз кто где и что делает. Кого спрашивать — без понятия, куда можно прийти за ответами — без понятия, что такое клавиатура тоже не знаю )))
Ты пойми, я уже старый, круг общения устоявшийся, в жизни мало чего добился. Но если сегодня(имею ввиду в обозримом будущем) не определюсь, будет плохо. Поскольку я уже больше месяца уделил обучению чему-то, то значит, это надолго. А без общения с людьми из отрасли ты мало чего поймёшь.
Поэтому, ты не думай, что я прикалываюсь, издеваюсь или вообще дурак. Хотя, насчет последнего, надо еще подумать )) просто наш местный форум — единственное место, где можно ближе ознакомиться с интересующей тебя темой в рамках краснодара.

maksss 17.01.2016 10:16

37-newNick > Хватит прибедняться. ;)
В рамках Краснодара как-то всё печально, мне кажется.. Тем более в плане С++. :(
А по твоему вопросу - погугли например Линукс. Или boost. :)

Vadim_ 18.01.2016 03:14

37-newNick >Место выбрал так себе, вот лет 10-14 назад, тут было живенько;))

35-newNick >Смотри open source. Там и на кошечках можно потренироваться. А с учетом твоего уклона в энергетику можешь глянуть на [url]http://oscada.org/ru/glavnaja/[/url]
)


Текущее время: 09:33. Часовой пояс GMT +3.