С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
Mr. Pyatachok
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
1

внешние функции

27.01.2012, 23:27. Просмотров 4060. Ответов 18
Метки нет (Все метки)

Всем привет!

Сижу,туплю:
В задании написано: "тип данных является струкурой с необходимыми полями, а операции реализуются как внешние функции, которые получают объекты данного типа в качестве аргументов"

Так вот структура, например:
C++
1
2
3
4
5
struct Angle
{
    int degree;
    int minute;
};
Т.е. напр., внешняя функция инициализации будет так выглядеть:
C++
1
2
3
4
5
6
7
Angle Init(int d,int m)
{
    Angle angle;
    angle.degree=d;
    angle.minute=m;
    return angle;
}
Т.е я должен каждый раз создавать один и тот же объект angle? (первый вопрос)
И второй нубский вопрос: а как вызвать внешнюю функцию в main()?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2012, 23:27
Ответы с готовыми решениями:

Внешние функции в классе
del

Объединять классы и внешние функции в одной программе плохой тон программирования?
Доброго времени суток! Преподаватель в институте задал определённую задачу,...

Внутренние и внешние связи
int externalint=5; const int j=10; int main() { } В книге...

Шаблоны: неразрешенные внешние элементы
Пишу шаблонный класс-массив. Появилась такая проблема. Если инициализировать...

Неразрешенные внешние символы/элементы
появились такие ошибки error LNK1120: неразрешенных внешних элементов: 1...

18
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
27.01.2012, 23:31 2
наверно имелось ввиду следующее

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct Angle
{
        int degree;
        int minute;
};
 
void Init(Angle& a, int deg, int min)
{
a.degree = deg;
a.minute = min;
 
};
 
 
int main()
 
{
Angle a;
Angle b;
 
Init(a,4,5); //вызовы внешней функции 
Init(b,11,3);//для разных объектов
 
 
return 0;
}
1
Mr. Pyatachok
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
27.01.2012, 23:33  [ТС] 3
Извините, если Вам не смешно, у меня правильно хоть написана внешняя функция?
0
ШКІПЕР
96 / 96 / 22
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
Завершенные тесты: 1
27.01.2012, 23:34 4
А мне кажется, что так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
 
struct Angle
{
        int degree;
        int minute;
};
 
 
Angle Init(int d,int m)
{
        Angle angle;
        angle.degree=d;
        angle.minute=m;
        return angle;
}
 
int main()
{
    Angle a = Init (1, 2);
 
    return EXIT_SUCCESS;
}
1
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.01.2012, 23:37 5
ШКІПЕР, а временный объект-то зачем создавать?
0
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
27.01.2012, 23:38 6
C++
1
2
3
4
5
6
7
Angle Init(int d,int m)
{
        Angle angle;
        angle.degree=d;
        angle.minute=m;
        return angle;
}
в контексте твоего вопроса не совсем

а операции реализуются как внешние функции, которые получают объекты данного типа в качестве аргументов"
твоя функция создает внутри себя объект затем присваивает значения, затем это все должно быть скопировано в такой же объект и возвращено а объект из тела функции будет уничтожен.

задача вроде другая. не создавать, а именно оперировать с готовым объектом внешними функциями
1
Mr. Pyatachok
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
27.01.2012, 23:39  [ТС] 7
ШКІПЕР, спасибо, а если я буду вызывать другие функции, то мне чтоли придется каждый раз содавать новый объект?
0
ШКІПЕР
96 / 96 / 22
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
Завершенные тесты: 1
27.01.2012, 23:42 8
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
а если я буду вызывать другие функции, то мне чтоли придется каждый раз содавать новый объект?
Неудачный пример с этим Init. Если другие фунцкии, что будут изменять структуру - можна передавать адрес на нее, а не создавать заново. Все зависит от того, для чего нужна функция. (Или вопрос неправильно понял ?)
1
Mr. Pyatachok
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
27.01.2012, 23:43  [ТС] 9
AzaKendler, т.е. я неправильно понял, надо было все-таки:
C++
1
2
3
4
5
6
void Init(Angle& a, int deg, int min)
{
a.degree = deg;
a.minute = min;
 
};
Хорошо, спасибо
0
ШКІПЕР
96 / 96 / 22
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
Завершенные тесты: 1
27.01.2012, 23:43 10
Цитата Сообщение от soon Посмотреть сообщение
а временный объект-то зачем создавать?
Тогда лучше сделать так:
C++
1
Angle& a = Init (1, 2);
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
27.01.2012, 23:44 11
ой вей
си стайл таков
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
BOOL angle_init (Angle* angle, int d, int m)
{
        if (!angle || d < 0 || m <0) return FALSE;
        angle->degree=d;
        angle->minute=m;
        return TRUE;
}
 
int main()
{
        Angle angle;
        angle_init (&angle, 2, 3);
        return 0;
}
1
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
27.01.2012, 23:52 12
Mr. Pyatachok, даже не думай делать так
Цитата Сообщение от ШКІПЕР Посмотреть сообщение
C++
1
Angle& a = Init (1, 2);
1
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.01.2012, 23:55 13
ШКІПЕР, фиг с ним, что в Си(судя по хедерам) нет ссылочного типа. Но возвращать созданный в функции объект по ссылке - это круто.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
28.01.2012, 00:00 14
Цитата Сообщение от soon Посмотреть сообщение
Но возвращать созданный в функции объект по ссылке - это круто.
ну тут не совсем так
оно правда даже не компилируется
1
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.01.2012, 00:09 15
Цитата Сообщение от alex_x_x Посмотреть сообщение
ну тут не совсем так
Поясните, пожалуйста. То, что "круто" - сарказм, я надеюсь, все поняли.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7092 / 3394 / 461
Регистрация: 04.12.2011
Сообщений: 9,446
Записей в блоге: 5
28.01.2012, 02:48 16
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
AzaKendler, т.е. я неправильно понял, надо было все-таки:

C++
1
2
3
4
5
void Init(Angle& a, int deg, int min)
{
a.degree = deg;
a.minute = min;
};
Думаю, это то, что требуется в задании.
А возвращать ссылки на локально созданные объекты это - не хорошо.
Кстати, кроме простой инициализации инициализация нулями - выполнение задачи в чистом виде, т.к. не требует других аргументов кроме ссылки на объект.
Пересчет в минуты, в радианы - функции принимающее один аргумент - объект.
Тип возвращаемого значения у всех, конечно void, т.к. вызывающая точка всегда знает какой экземпляр имеется ввиду, (она его передает функции).
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
28.01.2012, 11:33 17
soon, тут инициализация ссылки временным объектом
1
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.01.2012, 12:31 18
alex_x_x, это понятно, я имел в виду доведенный до компилируемого вида вариант, путем возвращения из функции ссылки на объект.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7092 / 3394 / 461
Регистрация: 04.12.2011
Сообщений: 9,446
Записей в блоге: 5
28.01.2012, 15:27 19
Цитата Сообщение от soon Посмотреть сообщение
alex_x_x, это понятно, я имел в виду доведенный до компилируемого вида вариант, путем возвращения из функции ссылки на объект.
Святое дело, если нужно. Например, передаем два и более объекта, сравниваем и возвращаем объект и т.п.
Как передать? Имена массивов, структур, объектов - указатели т.е. адресные выражения.
Реплика:
Цитата Сообщение от IGPIGP Посмотреть сообщение
А возвращать ссылки на локально созданные объекты это - не хорошо.
к примеру:

C++
1
2
3
4
5
void Init(Angle& a, int deg, int min)
{
a.degree = deg;
a.minute = min;
};
не относится, тут, вроде всё верно. Это относится к примерам, где объект создавался в функции и ею возвращался.
Мне показалось, что в задании ожидаются функции в которые ничего кроме объекта передавать не нужно, т.к. они связаны с объектом его внутренней логикой и сами знают, что делать
Например перевести в минуты, выдать десятичный градус, вернуть радианы (эти все уже не void) и т.п.
Т.е. делая, что-то полезное они используют только переданный объект и не позволяет вмешаться в него из-вне. Нечто вроде демонстрации совмещения инкапсуляции при использовании внешних функций, переход к курсу ООП и всё такое
1
28.01.2012, 15:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2012, 15:27

Подскажите про внешние зависимости
Всем привет. Никак не могу подключить к проекту внешние зависимости. Собираю...

Переопределение и неразрешённые внешние символы (VS2017)
Список ошибок во вложениях в виде скриншота. Внимание, ХЭДЭР #pragma once...

Библиотека fltk и неразрешенные внешние элементы
Здравствуйте. Уже не знаю, куда обратится, пишу сюда. Извиняюсь, если вопрос...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru