Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Novohudonosor
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
1

Передача адреса класса в функцию

12.01.2018, 19:17. Просмотров 409. Ответов 25
Метки нет (Все метки)

Здравствуйте
У меня такой вопрос, нигде не могу найти ответ: как сделать так, чтобы функция принимала адрес класса, или какой-то неопределенный тип, чтобы потом уже узнать адрес? Вот допустим код:

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
class V
{
private:
    double x1;
 
public:
    V(double ValueX1)
    {
        x1 = ValueX1;
    }
};
 
class L
{
public:
    void Add()
    {
        
    }
};
 
int main(void)
{
    V a1(3.0);
    L.Add(&a1);
}
Как вот адрес a1 передать в функцию Add класса L ? Подскажите пожалуйста.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2018, 19:17
Ответы с готовыми решениями:

Передача адреса функции в функцию (Класы)
Пример: // Общая функция increment void Test::IncBaseFunction ( void (Test::*IncFunct)() ) { ...

Передача адреса суммы двух чисел в функцию
#include <iostream> using namespace std; double MyF(double x) { x*=2; cout<<"Размер x: "...

Передача объекта класса в функцию С++
Всем привет! Возник вопрос по классам. Допустим мне нужно изменить объект класса через функцию...

Передача параметра в функцию класса
Здравствуйте. Столкнулся с проблемой. Почему переменная "x" не становится равна 25? #include...

Передача private класса в функцию
Имеется класс class Computer { ... } и второй класс который наследует первый class NoteBook1...

25
alex white
272 / 224 / 91
Регистрация: 27.06.2016
Сообщений: 635
Завершенные тесты: 1
12.01.2018, 19:29 2
Novohudonosor, никак, классов в рантайме не существует.
1
jahdjkhasjdhjah
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
12.01.2018, 19:29 3
C++
1
void Add(V *v_class)
не?
или по ссылке
C++
1
2
3
4
void Add(V &v_class)
...
L l;
l.add(a1);
Да, прежде, чем вызывать методы класса или создавайте экземпляр класса или объявляйте методы static
1
plapteshk
74 / 25 / 22
Регистрация: 22.06.2013
Сообщений: 119
12.01.2018, 19:31 4
C++
1
void Add(V &v);
Вызов: Add(a);
1
12.01.2018, 19:31
Novohudonosor
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 19:42  [ТС] 5
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
C++
1
void Add(V *v_class)
Да, прежде, чем вызывать методы класса или создавайте экземпляр класса или объявляйте методы static
Да, забыл просто. Спасибо. Сейчас посмотрю ваш вариант.

Добавлено через 3 минуты
С помощью template <typename V> ?
Не, не канает. Т.е. канает, только теперь при создании L, компилятор ругается, что отсутствует список аргументов для шаблон класса

Добавлено через 4 минуты
Цитата Сообщение от alex white Посмотреть сообщение
Novohudonosor, никак, классов в рантайме не существует.
А что делать, если мне нужно работать с этим классом внутри этой функции?
0
alex white
272 / 224 / 91
Регистрация: 27.06.2016
Сообщений: 635
Завершенные тесты: 1
12.01.2018, 19:48 6
Novohudonosor, ну, вы можете использовать имя класса, чтобы достучаться до него. Вы можете писать шаблоны чтобы принимать типы данных в качестве параметров. Но я полагаю вы просто путаете понятия "класс" и "объект (экземпляр) класса".
0
Novohudonosor
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 19:50  [ТС] 7
я не путаю. Мне просто нужно, чтобы эта функция могла принимать какой-то новый класс без изменения синтаксиса класса L
0
alex white
272 / 224 / 91
Регистрация: 27.06.2016
Сообщений: 635
Завершенные тесты: 1
12.01.2018, 20:00 8
Novohudonosor, путаете
0
Novohudonosor
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 20:03  [ТС] 9
да я там просто код неправильно написал) ничего я не путаю.
Там например в коде на строчке 24 объявляется экземпляр a1 класса V.
0
TRam_
зомбяк
1183 / 884 / 267
Регистрация: 14.05.2017
Сообщений: 2,934
12.01.2018, 20:08 10
Novohudonosor, если тебе требуется функция, принимающая аргумент типа, который будет известен только в момент вызова, то скорее всего тебе нужен шаблон этой функции. И компилятор самостоятельно наделает тебе машинный код таких же функций для всех типов, которые будешь использовать.
1
Novohudonosor
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 20:38  [ТС] 11
Я в общем сделал. Спасибо всем! Я не в том месте писал просто template <typename V>

А теперь у меня возник следующий вопрос, тут я немного код дописал, чтобы понятнее было:

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
class V
{
private:
    double x1;
 
public:
    V(double ValueX1)
    {
        x1 = ValueX1;
    }
    double d()
    {
        return 1;
    }
 
};
 
class L
{
public:
template <typename V>
    void Add(V ob)
    {
        cout << /*какая-то запись типо ob.d())*/ << endl;
    }
};
 
int main(void)
{
    V a1(3.0);
    L L1;
    L1.Add(&a1);
}
как теперь, зная адрес, обращаться через него к самому объекту класса, к его функциям?

Добавлено через 7 минут
там, где написано
C++
1
/*какая-то запись типо ob.d())*/
0
TRam_
зомбяк
1183 / 884 / 267
Регистрация: 14.05.2017
Сообщений: 2,934
12.01.2018, 20:43 12
C++
1
2
3
4
5
template <typename T>
    void Add(T *ob)
    {
        cout << ob->d() << endl;
    }
Добавлено через 1 минуту
T вместо V, потому что лучше не перемешивать названия классов с параметрами шаблона.
1
Novohudonosor
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 20:44  [ТС] 13
Круто!) Спасибо!)

Добавлено через 1 минуту
Цитата Сообщение от TRam_ Посмотреть сообщение
T вместо V, потому что лучше не перемешивать названия классов с параметрами шаблона.
Ок!)
0
TRam_
зомбяк
1183 / 884 / 267
Регистрация: 14.05.2017
Сообщений: 2,934
12.01.2018, 20:44 14
Подключение (параметризация) V вместо T происходит непосредственно в строке
C++
1
L1.Add(&a1);
0
Novohudonosor
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 20:45  [ТС] 15
А почему через точку не работает?

Добавлено через 35 секунд
Цитата Сообщение от TRam_ Посмотреть сообщение
Подключение (параметризация) V вместо T происходит непосредственно в строке
C++
1
L1.Add(&a1);
не понял. Ну где какие буквы поменять я знаю, если ты об этом.
0
TRam_
зомбяк
1183 / 884 / 267
Регистрация: 14.05.2017
Сообщений: 2,934
12.01.2018, 20:45 16
Хотя можно указывать подставляемый класс явно,
C++
1
L1.Add<V>(&a1);
но в данном случае компилятор и сам всё правильно подставит.
1
Novohudonosor
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 20:47  [ТС] 17
не понял опять) Что ты сделал этой буквой <V> ?
0
TRam_
зомбяк
1183 / 884 / 267
Регистрация: 14.05.2017
Сообщений: 2,934
12.01.2018, 20:49 18
Цитата Сообщение от Novohudonosor Посмотреть сообщение
А почему через точку не работает?
Чтоб работало через точку, передавать нужно не
C++
1
L1.Add(&a1);
а
C++
1
L1.Add(a1);
И в самой функции
C++
1
2
3
4
5
template <typename T>
    void Add(T ob)
    {
        cout << ob.d() << endl;
    }
или с передачей по ссылке
C++
1
2
3
4
5
template <typename T>
    void Add(T &ob)
    {
        cout << ob.d() << endl;
    }
Добавлено через 1 минуту
Цитата Сообщение от Novohudonosor Посмотреть сообщение
Что ты сделал этой буквой <V>
Указал, что функцию void Add(T) нужно сгенерировать для твоего класса class V, подставив вместо typename T твой класс V.
1
Novohudonosor
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 23:15  [ТС] 19
А подскажите пожалуйста, что значит вот такая запись:

C++
1
2
3
4
5
6
class V
{
private:
    V node;
public:
}
Когда в классе создается как бы переменная (или что это?) инициализация которой проводится именем самого этого класса?
0
TRam_
зомбяк
1183 / 884 / 267
Регистрация: 14.05.2017
Сообщений: 2,934
13.01.2018, 00:01 20
А не
C++
1
V *node;
?

Добавлено через 1 минуту
Потому что тот код, который в посте выше, выдаст ошибку компилятора
Bash
1
error: field 'node' has incomplete type 'V'
1
13.01.2018, 00:01
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2018, 00:01

Передача в функцию метод класса
Не получается передать в функцию метод класса... ...

Передача указателя на функцию-член класса
Необходимо передать фунцию-член класса как аргумент в функцию другого класса. Код: Файл...

Передача ссылки на обьект класса в функцию
Определен класс в хэддере: class List{ public: //... void Add(const List *list); ...


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

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

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