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

Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? - C++

Восстановить пароль Регистрация
 
 
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
19.11.2014, 11:45     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #1
скажем есть 2 класса
C++
1
2
3
4
5
6
7
8
9
class ItemList
{
public:
    ItemList();
    int   item[48];
    int   count;
 
    Func*func;
}
и
C++
1
2
3
4
5
6
7
8
class Func
{
public:
    Func(ItemList*itemlist);
    ItemList*itemlist;
    bool AddItem(int id);
    void Clear();
}
при объявлении ItemList внутри него объявляется Func, которому отправляется ссылка на класс ItemList .
можно ли в функциях Func обращаться к данным и функциям из ItemList не обращаясь постоянно к ссылке itemlist?
т.е. вот так
C++
1
2
3
4
5
6
bool AddItem(int id)
{
    if (count>=48)return false;
    item[count++]=id;
    return true;
}
нужно это для того, чтобы класс ItemList содержал только данные, потому как функций обработки этих данных тьма тмущая и добавление новых вызывает компиляцию почти всей программы.
есть using namespace std, но я не знаю как это работает. я - самоучка.

Добавлено через 5 минут
даже чтобы ItemList был struct
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 11:45     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке?
Посмотрите здесь:

C++ Как можно объявить класс, заранее не зная его тип template.
C++ [C++]Есть две переменные типа int. Обменять их значения без использования третьей переменной
C++ Как узнать Handle или PID процесса, зная его имя и класс?
C++ Вычислить сумму тех его элементов, значения которых есть четные числа
C++ Есть ли способ закончить "cin" и продолжить программу без ввода?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
04.12.2014, 16:11     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #21
ну,а чем Вас результат не устроил?
можно вот так сократить
C++
1
2
3
4
ReadStr(int strnum, char*, )//тут еще переменные добавить
{
file->ReadStr(file->Number(file->ReadPos(4, isresult->seek+17), 4), NUL);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
08.12.2014, 10:00  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #22
aLarman, тем, что мне интересна реализация.
я между классами обмениваюсь ссылками и много чего подключаю, только ради одной функции.
а я хочу передавать ссылки на функции без лишних подключений.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.12.2014, 10:07     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #23
Segaman, ссылка вообще не может ссылаться на тип, а значит и на класс. Ссылка ведёт себя как неявно разыменуемый указатель, а указатель должен быть на что то конкретное. Вот представь себе: едешь ты по дороге, а там дородные указатели, на одном написано "Москва там", на другом "А Бологое там". на третьем "А от там Питербрург" и вдруг вместо указателя на Ростов указатель без стрелки, на котором написано просто "населенный пункт". Вот этот последний - указатель на тип населённого пункта вообще. Как посмотришь на того, кто его ставил? Не ужели как на идиота? А надо бы, как на себя.
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
10.12.2014, 10:23  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #24
столкнулся с новой проблемой.
активно использую ItemList & itemlist, но временами во время запросов по этой ссылке программа просто падает.
я вычислил, что это происходит именно из-за запроса по этой ссылке. проверил адреса, совпадают.
в чем может быть проблема?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
10.12.2014, 10:26     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #25
объект на которого ссылается ссылка был уничтожен, например
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
11.12.2014, 09:54  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #26
aLarman, возможно. щас проверю
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
13.12.2014, 14:43  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #27
всё верно. объект и правда уничтожался.
спасибо.
есть еще вопрос.
скажем у меня в одном .cpp (не знаю как правильно называть) есть переменная int canedit.
в другом я создаю с таким же именем, но компиль при сборке ругается на то, что переменная встречается 2 раза.
-как можно сделать, чтобы у каждого был свой canedit
-как сделать, чтобы canedit был в одном cpp, а в других была ссылка на него?

и еще интересно про существование этих переменных.
т.е. в каждом cpp есть свои переменные. при запуске программы они сразу создаются и сидят в памяти, пока работает программа или как-то по другому?

вот пример
C++
1
2
3
4
5
6
#include "main.h"
int canedit;
void Init()
{
canedit = false;
}
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
13.12.2014, 14:46     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #28
Цитата Сообщение от Segaman Посмотреть сообщение
-как можно сделать, чтобы у каждого был свой canedit
static int canedit; в каждом нужном cpp. В каждом будет свой экземпляр canedit.
Или еще можно поместить ее в безымянный namespace.

Цитата Сообщение от Segaman Посмотреть сообщение
-как сделать, чтобы canedit был в одном cpp, а в других была ссылка на него?
В нужно cpp пишешь int canedit; В остальных extern int canedit;

Читай про связывание в С++.

Цитата Сообщение от Segaman Посмотреть сообщение
при запуске программы они сразу создаются и сидят в памяти, пока работает программа
Да.
hoggy
5114 / 2115 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
13.12.2014, 14:53     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #29
Цитата Сообщение от DrOffset Посмотреть сообщение
В нужно cpp пишешь int canedit; В остальных extern int canedit;
ТС, если вы используете этот сишный рудимент, то вы получите зависимость от порядка инициализации единиц трансляций.

В этом случае вам нужно будет иметь ввиду: до запуска функции main жизни нет.
В противном случае вы можете поиметь весьма причудливые баги.


Есть альтернативный вариант: использование локальных статических переменных.
Этот способ дает безопасность, стабильность, и автоматику при работе с сингелтонами.

Но этот способ подразумевает, что для того, что бы получить доступ к локально-статическим данным, необходимо вызвать функцию, которая вернет ссылку на данные.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
13.12.2014, 15:28     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #30
hoggy, может быть стоит это рассказывать обращаясь к ТС, а не ко мне?
Уведомление о твоем ответе не дойдет до ТС, соответственно он может никогда его не увидеть.
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
13.12.2014, 16:59  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #31
hoggy, DrOffset, по вашим словам я решил, что нужно писать static int & canedit в разных cpp, сделать к каждому Init(int _canedit), который укажет ссылку и вызывать из главного cpp.
проблема в том что компиль меня ругает
error: 'canedit' declared as reference but not initialized
hoggy
5114 / 2115 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
13.12.2014, 17:17     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #32
Цитата Сообщение от Segaman Посмотреть сообщение
hoggy, DrOffset, по вашим словам я решил, что нужно писать static int & canedit
Я не давал повода так думать.


в hpp файле:
C++
1
2
#pragma once
int& foo();  //<---- доступ к глобальным данным через функцию
в cpp фалйе
C++
1
2
3
4
5
// глобальная переменная объявляется, как локальный статик.
// что гарантирует независимость от порядка инициализации единиц трансляций.
// с++11 так же гарантирует безопасность инициализации локального статика
// в многопоточной среде.
int& foo() { static int v = 0; return v; }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2014, 16:04     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке?
Еще ссылки по теме:

Присвоить ссылку на функцию, по ссылке на объект:) C++
C++ Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С
C++ Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения?

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

Или воспользуйтесь поиском по форуму:
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
17.12.2014, 16:04  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #33
помогла вот эта статья
Особенности использования extern и static в C/C++
Yandex
Объявления
17.12.2014, 16:04     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке?
Ответ Создать тему
Опции темы

Текущее время: 07:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru