Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как можно совместно несколькими функциями использовать одни и те же данные?

Натали Ученик (213), закрыт 1 месяц назад
Как можно совместно несколькими функциями использовать одни и те же данные?
Лучший ответ
Николай Веселуха Высший разум (360960) 2 месяца назад
 #include  
using namespace std;
double add(const double a, const double b) {
return a + b;
}
double sub(const double a, const double b) {
return a - b;
}
double mul(const double a, const double b) {
return a * b;
}
double div(const double a, const double b) {
return a / b;
}
int main() {
double a = 5, b = 7;
cout << a << " + " << b << " = " << add(a, b) << '\n';
cout << a << " - " << b << " = " << sub(a, b) << '\n';
cout << a << " * " << b << " = " << mul(a, b) << '\n';
cout << a << " / " << b << " = " << div(a, b) << '\n';
}
Остальные ответы
D P Мудрец (11158) 2 месяца назад
На самом деле это очень коварный вопрос, рассмотрение которого заслуживает гораздо большего, чем программа с 4 простыми функциями.
Первое, что нужно четко усвоить - внутрь функции попадает КОПИЯ того, что передано ей на вход. Причем в ряде случаев копирование может быть очень затратным мероприятием. Поэтому, если вам надо изменять данные, расположенные вне функции, при помощи каких-то действий внутри функции, то сделать это просто передав их в функцию не получится. Решением является передача в функцию не самих данных а указателя на них. В Си++ тот же эффект можно получить и при помощи передачи данных по ссылке. Ну а по настоящему весело становится, когда вам надо совместно использовать данные при помощи функций, которые выполняются в разных потоках. Тут вам потребуется изучать и использовать разного рода объекты типа мьютексов, которые позволяют организовать безопасный доступ к данным.
В качестве иллюстрации, что все не так просто, предлагаю небольшую программу:
 #include  

// Класс "Элемент данных" для исследования некоторых особенностей
// работы с данными
template
class DataItem
{
private:
T data{};
public:
// Конструктор для создания пустого объекта
DataItem()
{
std::cout << this << ": cоздание пустого объекта " << std::endl;
}
// Конструктор создания инициализированного объекта
DataItem( T Data )
{
data = Data;
std::cout << this << ": cоздание инициализированного объекта"
<< std::endl;
}
// Конструктор копирования
DataItem(DataItem& di)
{
void* other = (void*)(&di);
data = di.data;
std::cout << this
<< ": создание объекта с копированием данных из "
<< other << std::endl;
}
// Деструктор
~DataItem()
{
std::cout << this << ": уничтожение объекта" << std::endl;
}
// Сохранить данные в объекте
void set( T Data ) { data = Data; }
// Извлечение даных из объекта
T get( void ) { return data; }
// Вывод данных на экран
void show( void ) { std::cout << data << std::endl; }
};

// Функция, в котрую передаются наши данные
template void example_fn( DataItem item )
{
DataItem new_item = item;
new_item.show();
}

int main( int argc, char* argv[] )
{
DataItem item;
item.set( 345 );
std::cout << "Пример взаимодействия данных и функций:" << std::endl;
example_fn( item );
return 0;
}
Данные передаются в функцию example_fn по значению. Обратите внимание, какие фееричные вещи при этом происходят.
D PМудрец (11158) 2 месяца назад
Класс DataItem специально сделан в виде шаблона, с которым можно по всякому играться. Попробуйте, например, в качестве эксперимента вместо int создать класс, который принимает другие типы, особенно строки. Что-то типа такого
 DataItem   item;
std::string str;
// Породим строку из звездочек размером в 100 Мб
str.resize( 104857600, '*' );
item.set( str );
D PМудрец (11158) 2 месяца назад
Для большей наглядности стоит еще поменять местами присвоение и вывод сообщения:
         //  Конструктор копирования  
DataItem(DataItem& di)
{
void* other = (void*)(&di);
std::cout << this
<< ": создание объекта с копированием данных из "
<< other << std::endl;
data = di.data;
}
Похожие вопросы