Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
QVO
637 / 448 / 32
Регистрация: 26.10.2010
Сообщений: 1,262
Записей в блоге: 4
Завершенные тесты: 2
#1

Передать поле класса в функцию - C++

29.07.2015, 14:00. Просмотров 241. Ответов 4
Метки нет (Все метки)

Здравствуйте форумчане.
Как передать поле класса в функцию с возможностью изменения значения этого поля?

Ссылка на компиляцию: http://ideone.com/qlBirp

Два класса для теста:
C++
1
2
3
4
5
6
class Genre
{
    public:
        Genre() = default;
    std::string name;   
};
C++
1
2
3
4
5
6
7
struct Provider
{
    public:
        Provider() = default;
    std::string name;   
    std::string logo;
};
Функция:
C++
1
2
3
4
5
6
template<typename Class, typename Field>
void foo(shared_ptr<Class> myClass, Field myField)
{
    std::cout << myClass->myField << std::endl;
    myClass->myField = "hello";
}
Применение:
C++
1
2
3
4
5
6
7
8
int main() {
    auto genre = std::make_shared<Genre>();
    auto provider = std::make_shared<Provider>();
    
    foo<Genre, std::string Genre::*name>(&genre, &genre->name);
    
    return 0;
}
С уважением QVO.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2015, 14:00     Передать поле класса в функцию
Посмотрите здесь:

как мне функцию одного класса в функцию базового вставить C++
Как в конструкторе класса передать параметром указатель на функцию? C++
C++ Статическое поле класса, имеющее тип того же класса
C++ Только константное статическое поле НЕ МОЖЕТ быть поле членом класса !
Как передать значение функции класса в другую функцию? C++
C++ Передать структуру в функцию другого класса
C++ Как передать указатель на функцию через метод класса ?
Как передать нестатическое поле в статический метод класса? C++
Как передать функцию в функцию? C++
Не могу передать функцию в функцию C++
C++ Как передать (или присвоить) имя в поле класса из main?
В функцию с переменным числом параметроы передать указатели на функцию C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
smartpointer
67 / 61 / 23
Регистрация: 17.02.2014
Сообщений: 255
29.07.2015, 15: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
27
28
29
30
31
32
33
#include <iostream>
#include <string>
 
class A
{
public:
    std::string str;
    A():str("Hello World\n")
    {
    }
    void Print()
    {
        std::cout<<str<<std::endl;
    }
};
 
typedef std::string A::*p_str;
 
template<typename First,typename FirstField>void Foo(First& first,FirstField First::*ptr )
{
    first.*ptr = "Hello\n";
}
 
 
int main()
{
    A a;
    p_str a_string = &A::str;
    a.Print();
    Foo(a,a_string);
    a.Print();
    return 0;
}
QVO
637 / 448 / 32
Регистрация: 26.10.2010
Сообщений: 1,262
Записей в блоге: 4
Завершенные тесты: 2
29.07.2015, 15:43  [ТС]     Передать поле класса в функцию #3
Погуглил на тему Pointer-to-member shared_ptr и вопрос решился.
C++
1
2
3
4
5
6
template <typename T, typename R>
void foo(std::shared_ptr<T>* ptr, R T::* member) 
{
    std::cout << ptr->get()->*member << std::endl;
    ptr->get()->*member = "...";
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main() {
    auto genre = std::make_shared<Genre>();
    auto provider = std::make_shared<Provider>();
    
    genre->name = "123";
    provider->logo = "http://";
 
    foo<Genre, std::string>(&genre, &Genre::name);
    foo<Genre, std::string>(&genre, &Genre::name);
    
    foo<Provider, std::string>(&provider, &Provider::logo);
    foo<Provider, std::string>(&provider, &Provider::logo);
    
    
    return 0;
}
Вывод:
Код
123
...
http://
...
Ссылка на компиляцию: http://ideone.com/qlBirp
nmcf
4944 / 4282 / 1431
Регистрация: 14.04.2014
Сообщений: 16,804
29.07.2015, 15:44     Передать поле класса в функцию #4
Это не противоречит принципам ООП? Поля должны изменять функции-члены.
QVO
637 / 448 / 32
Регистрация: 26.10.2010
Сообщений: 1,262
Записей в блоге: 4
Завершенные тесты: 2
29.07.2015, 15:54  [ТС]     Передать поле класса в функцию #5
nmcf,

Не по теме:

можно 10к строк однотипного кода сократить до 200. Все зависит от задачи.

Yandex
Объявления
29.07.2015, 15:54     Передать поле класса в функцию
Ответ Создать тему
Опции темы

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