Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19

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

12.01.2018, 19:17. Показов 1639. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
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: " <<sizeof(x)<<" Значение...

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

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

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

Добавлено через 4 минуты
Цитата Сообщение от alex white Посмотреть сообщение
Novohudonosor, никак, классов в рантайме не существует.
А что делать, если мне нужно работать с этим классом внутри этой функции?
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
12.01.2018, 19:48
Novohudonosor, ну, вы можете использовать имя класса, чтобы достучаться до него. Вы можете писать шаблоны чтобы принимать типы данных в качестве параметров. Но я полагаю вы просто путаете понятия "класс" и "объект (экземпляр) класса".
0
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 19:50  [ТС]
я не путаю. Мне просто нужно, чтобы эта функция могла принимать какой-то новый класс без изменения синтаксиса класса L
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
12.01.2018, 20:00
Novohudonosor, путаете
0
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 20:03  [ТС]
да я там просто код неправильно написал) ничего я не путаю.
Там например в коде на строчке 24 объявляется экземпляр a1 класса V.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
12.01.2018, 20:08
Novohudonosor, если тебе требуется функция, принимающая аргумент типа, который будет известен только в момент вызова, то скорее всего тебе нужен шаблон этой функции. И компилятор самостоятельно наделает тебе машинный код таких же функций для всех типов, которые будешь использовать.
1
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 20:38  [ТС]
Я в общем сделал. Спасибо всем! Я не в том месте писал просто 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_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
12.01.2018, 20:43
C++
1
2
3
4
5
template <typename T>
    void Add(T *ob)
    {
        cout << ob->d() << endl;
    }
Добавлено через 1 минуту
T вместо V, потому что лучше не перемешивать названия классов с параметрами шаблона.
1
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 20:44  [ТС]
Круто!) Спасибо!)

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

Добавлено через 35 секунд
Цитата Сообщение от TRam_ Посмотреть сообщение
Подключение (параметризация) V вместо T происходит непосредственно в строке
C++
1
L1.Add(&a1);
не понял. Ну где какие буквы поменять я знаю, если ты об этом.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
12.01.2018, 20:45
Хотя можно указывать подставляемый класс явно,
C++
1
L1.Add<V>(&a1);
но в данном случае компилятор и сам всё правильно подставит.
1
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 20:47  [ТС]
не понял опять) Что ты сделал этой буквой <V> ?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
12.01.2018, 20:49
Цитата Сообщение от 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
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 19
12.01.2018, 23:15  [ТС]
А подскажите пожалуйста, что значит вот такая запись:

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

Добавлено через 1 минуту
Потому что тот код, который в посте выше, выдаст ошибку компилятора
Bash
1
error: field 'node' has incomplete type 'V'
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2018, 00:01
Помогаю со студенческими работами здесь

Передача в функцию метод класса
Не получается передать в функцию метод класса... hge-&gt;System_SetState(HGE_FRAMEFUNC,&amp;GameManager::UpdateScene); ...

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

Передача параметра в функцию класса
Здравствуйте. Столкнулся с проблемой. Почему переменная &quot;x&quot; не становится равна 25? #include &lt;iostream&gt; using namespace std; ...

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

Передача параметров в дружественную функцию класса
Всем доброго времени суток. Читал про дружественные функции, в учебнике по которому учусь написано, что в дружественную функцию класса...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru