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

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

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

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

29.07.2015, 14:00. Просмотров 251. Ответов 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++
есть статическая фукция static LRESULT CALLBACK WndProc ( HWND,UINT,WPARAM,LPARAM); в ней нужно использоавть поля класса, вопрос -...

Как передать (или присвоить) имя в поле класса из main? - C++
Листинг: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class Myname { string name; int old; Myname(string...

Передать структуру в функцию другого класса - C++
Добрый день, при выполнении КР возник затор, необходима подсказка. Нужно создать объект класса и инициализировать его конструктором со...

Как в конструкторе класса передать параметром указатель на функцию? - C++
Друзья! Вот тут всё понятно, есть класс, в котором приватная функция f_0, в конструкторе передаётся указатель на функцию f_1. Эта функция...

Как передать значение функции класса в другую функцию? - C++
имеется класс class Test { public: int getB() { return B; } void setB(int b) { B = b; } private: ...

Как передать указатель на функцию через метод класса ? - C++
typedef void (*FuncCallback)(float* flValue); Пробовал по всякому и ни как: Class.CallFunc // error C3867: CClass::CallFunc :...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
smartpointer
67 / 61 / 23
Регистрация: 17.02.2014
Сообщений: 256
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
638 / 449 / 32
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 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
5310 / 4630 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
29.07.2015, 15:44 #4
Это не противоречит принципам ООП? Поля должны изменять функции-члены.
QVO
638 / 449 / 32
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
Завершенные тесты: 2
29.07.2015, 15:54  [ТС] #5
nmcf,

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2015, 15:54
Привет! Вот еще темы с ответами:

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект - C++
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня , так как учусь работать с указателями)...

Не могу разобраться как передать корректно передать массив из функции в функцию - C++
//--------------------------------------------------------------------------- #pragma hdrstop ...

Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! - C++
class CCoords { static const float rate = 1.0f; // ОШИБКА !!! bool IsComputed; float x,y; POINT2D ...

В конструктор класса передать объект этого класса - C++
Вопрос на засыпку :) Как в конструктор класса передать объект этого класса? Т.е. class A { public: A(const char* s){} ...


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

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

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