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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2009, 00:41   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию встроеннные функции, ссылочные переменные

нужно создать функцию, которая ссылается на структура шаболона box как на своё формальный аргумент и присваивает элементу volume результат произведения трёх других измерений. При этом необхоимо созать встроенную функцию, защитеть элементы структуры от изменений (все, кроме volume и использовать ссылочные переменные
код
Код:
#include <iostream.h>
struct box
{
char marker[40];
const float height;
const float width;
const float length;
float volume;
}
inline box gogogo(&lalala) {lalala.volume=lalala.height*lalala.width*lalala.length;
return lalala.volume}//ошибка. Компиллятору что-то не нравится в размещении встроенной функции и в том, что heing width lenght  - константы.
main()
{    box st;
st.marker="HOW";
st.height=1.0;
st.width=2.0;
st.lengtg=3.0;
st.volume=4.0;
gogogo(&st);
cout<<st.volume;
cin.get();
}

Последний раз редактировалось MaTBeu; 10.05.2009 в 16:28.
Dimarik вне форума Ответить с цитированием
Старый 10.05.2009, 01:16   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Так вы же в структуре объявляете константы. Нельзя так.
Вот как-то так:
Код:
#include <iostream>
#include <string.h>
using namespace std;

struct box
{
float height;
float width;
float length;
char marker[40];

float volume;
};
inline float gogogo(box& la)
 {
  la.volume = la.height*la.width*la.length;
  return la.volume;
 }

int main()
{
box st;
strcpy(st.marker,"HOW");
st.height=1.0;
st.width=2.0;
st.length=5.0;
st.volume=4.0;

gogogo(st);
cout<<st.volume;
cin.get();
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 10.05.2009, 08:57   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

а как тогда защитить данные от изменения???? может можно создать константу-ссылку? если да, то как? если нет, то что можно сделать?
Dimarik вне форума Ответить с цитированием
Старый 10.05.2009, 09:11   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Код:
struct box
{
float height;
float width;
float length;
char marker[40];

mutable float volume;
};
inline float gogogo(box const &la)
 {
  la.volume = la.height*la.width*la.length;
  return la.volume;
 }
У volume слово mutable показывает, что это значение может изменяться извне. Ну чтобы у константного объекта этот член можно было изменять. Остальные члены изменить в функции будет нельзя (если конечно не писать всякие там const_cast)

Последний раз редактировалось pu4koff; 10.05.2009 в 12:27.
pu4koff вне форума Ответить с цитированием
Старый 10.05.2009, 09:41   #5
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

Странно, зачем делать неизменяемые константы и писать функцию которая их пытается менять?
Цитата:
а как тогда защитить данные от изменения????
Защитить от себя что-ли?
Nomlpppp вне форума Ответить с цитированием
Старый 10.05.2009, 10:24   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

у меня возник вопрос. вогда мы создаём функцию и её прототипом будет
int* b(x,y)
или
int &b(x,y)
после завершения работы функции, локальные переменные НЕ будут удалены из памяти????
Dimarik вне форума Ответить с цитированием
Старый 10.05.2009, 11:08   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Dimarik
у меня возник вопрос. вогда мы создаём функцию и её прототипом будет
int* b(x,y)
или
int &b(x,y)
после завершения работы функции, локальные переменные НЕ будут удалены из памяти????
Нет, они будут удалены. Ведь они же локальные.
Небольшой пример:
Код:
#include <iostream>
#include <conio.h>
using namespace std;

int& b(int x,int y)
{
 int k = x+y;
 return k;
}

int main(){
int a;
a = b(1,2);
cout<<a;

getch();
return 0;
}
Несмотря на то, что переменная k после выхода из функции не существует, значение в памяти все-таки еще есть. Поэтому программа выведет на экран число 3 (хотя компилятор на вас ругнется). Но так лучше не делать.

Цитата:
Сообщение от pu4koff
volume слово mutable показывает, что это значение может изменяться извне. Ну чтобы у константного объекта этот член можно было изменять. Остальные члены изменить в функции будет нельзя (если конечно не писать всякие там static_cast)
Любопытная штука )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 10.05.2009, 11:40   #8
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Нет, они будут удалены. Ведь они же локальные.
Небольшой пример:
Код:
#include <iostream>
#include <conio.h>
using namespace std;

int& b(int x,int y)
{
 int k = x+y;
 return k;
}

int main(){
int a;
a = b(1,2);
cout<<a;

getch();
return 0;
}
Несмотря на то, что переменная k после выхода из функции не существует, значение в памяти все-таки еще есть. Поэтому программа выведет на экран число 3 (хотя компилятор на вас ругнется). Но так лучше не делать.


Любопытная штука )
хм... а если я выделю память с помощью оператора new???
останутся до очитски памяти оператором delete???
или же будут и без него удалены в виду того, что это локальные переменные?
Dimarik вне форума Ответить с цитированием
Старый 10.05.2009, 11:46   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Dimarik Посмотреть сообщение
хм... а если я выделю память с помощью оператора new???
останутся до очитски памяти оператором delete???
или же будут и без него удалены в виду того, что это локальные переменные?
В этом случае, пока не вызовите delete, данные не удалятся
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как прописать переменные типа array в функции? Dux Общие вопросы Delphi 2 09.12.2008 23:46
Исправте программу.Ссылочные типы данных. Динамическая память ромка) Паскаль, Turbo Pascal, PascalABC.NET 2 30.05.2008 04:24
Ссылочные типы данных. Динамическая память/HELP!! ромка) Паскаль, Turbo Pascal, PascalABC.NET 2 22.05.2008 09:03
переменные FoxPro Vasya Свободное общение 0 27.01.2008 00:29
Переменные из БД Кронос БД в Delphi 2 06.06.2007 11:26