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

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

Войти
Регистрация
Восстановить пароль
 
 
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 145
#1

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

19.11.2014, 11:45. Просмотров 686. Ответов 32
Метки нет (Все метки)

скажем есть 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++):

Есть ли способ использовать оператор And в операторе Rlike? (mysql) - PHP
Нужно чтобы в ответ на mysql запрос select N, f1 from bibl.data where f1 Rlike 'федотов AND грачев' выводило записи, в которых...

Использовать массивы или есть более элегантный способ? - C#
Пишу игру. Есть предметы которые выпадают из монстров. Например: золото, аптечка, автомат и т.д. У каждого предмета есть шанс его...

Как получить id элемента, зная только его класс? - JavaScript
Приветствую товарищи! Пожалуйста, помогите мне с решением одной задачи. У меня есть такой код: <button...

Как можно объявить класс, заранее не зная его тип template. - C++
Класс: template <class type> class My { private: int n; double sum; type *al; public: My() { al =...

Есть ли способ изменить значения в массиве за одну операцию? - C (СИ)
Здравствуйте, недавно начал осваивать Си. Изучил K&R, полистал несколько разных мануалов. Нигде не увидел ответа на простой вопрос: есть ли...

Как скопировать файл, зная только его имя без расширения? - CMD/BAT
Нужно скопировать файл,зная только его название,но не зная расширения.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
02.12.2014, 11:08 #16
Цитата Сообщение от Segaman Посмотреть сообщение
т.е. ссыку на функцию нельзя получить.
а как же тогда замена кода окна?
че это можно, тока не ссылку а указатель, проблема в том чтобы ее вызвать нужен объект все равно, либо делать ф-цию не членом класса
Kastaneda
Форумчанин
Эксперт С++
4518 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,267
Записей в блоге: 2
Завершенные тесты: 1
02.12.2014, 11:33 #17
Можно через binder'ы сделать, тогда можно будет вызывать метод без указания объекта.
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 145
04.12.2014, 10:16  [ТС] #18
Kastaneda, это сложнее в исполнении.
aLarman, можно поподробнее. очень хотелось бы облегчить код.
а то частенько выходят вот такие вагоны
C++
1
isresult->comment       = file->ReadStr(file->Number(file->ReadPos(4,isresultseek+17),4),NULL);///комментарий
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
04.12.2014, 10:22 #19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ReadStr(int strnum, char*)
{
file->ReadStr(strnum, NULL);
}
Number(int pos, int k)
{
file->Number(pos, k);
}
ReadPos(int i, int j)
{
file->ReadPos(i,j)
}
 
isresult->comment = ReadStr(Number(ReadPos(4, isresult->seek+17), 4), NULL);
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 145
04.12.2014, 15:45  [ТС] #20
aLarman, т.е. подругому ReadStr() из класса file вызвать нельзя?
aLarman
642 / 563 / 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
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 145
08.12.2014, 10:00  [ТС] #22
aLarman, тем, что мне интересна реализация.
я между классами обмениваюсь ссылками и много чего подключаю, только ради одной функции.
а я хочу передавать ссылки на функции без лишних подключений.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.12.2014, 10:07 #23
Segaman, ссылка вообще не может ссылаться на тип, а значит и на класс. Ссылка ведёт себя как неявно разыменуемый указатель, а указатель должен быть на что то конкретное. Вот представь себе: едешь ты по дороге, а там дородные указатели, на одном написано "Москва там", на другом "А Бологое там". на третьем "А от там Питербрург" и вдруг вместо указателя на Ростов указатель без стрелки, на котором написано просто "населенный пункт". Вот этот последний - указатель на тип населённого пункта вообще. Как посмотришь на того, кто его ставил? Не ужели как на идиота? А надо бы, как на себя.
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 145
10.12.2014, 10:23  [ТС] #24
столкнулся с новой проблемой.
активно использую ItemList & itemlist, но временами во время запросов по этой ссылке программа просто падает.
я вычислил, что это происходит именно из-за запроса по этой ссылке. проверил адреса, совпадают.
в чем может быть проблема?
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
10.12.2014, 10:26 #25
объект на которого ссылается ссылка был уничтожен, например
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 145
11.12.2014, 09:54  [ТС] #26
aLarman, возможно. щас проверю
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 145
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
7089 / 4230 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
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
6531 / 2711 / 468
Регистрация: 15.11.2014
Сообщений: 5,987
Завершенные тесты: 1
13.12.2014, 14:53 #29
Цитата Сообщение от DrOffset Посмотреть сообщение
В нужно cpp пишешь int canedit; В остальных extern int canedit;
ТС, если вы используете этот сишный рудимент, то вы получите зависимость от порядка инициализации единиц трансляций.

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


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

Но этот способ подразумевает, что для того, что бы получить доступ к локально-статическим данным, необходимо вызвать функцию, которая вернет ссылку на данные.
DrOffset
7089 / 4230 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
13.12.2014, 15:28 #30
hoggy, может быть стоит это рассказывать обращаясь к ТС, а не ко мне?
Уведомление о твоем ответе не дойдет до ТС, соответственно он может никогда его не увидеть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2014, 15:28
Привет! Вот еще темы с ответами:

Как узнать Handle или PID процесса, зная его имя и класс? - C++
Как узнать Handle или PID процесса, зная его имя и класс?

Есть ли быстрый способ проверки значения в таблице из кода VBA? - MS Access
На форме есть поле, пользователь вводит некое значение, хочется сразу его проверять, не присутствует ли оно уже в какойто определённой...

Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С - C++
Всем привет, как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С ? class A { public: A(); ...

Передача по ссылке, или изменяется ли класс при его передаче? - Java EE
Допустим есть класс public class LastHero { private static LastHero _instance; private List<L2PcInstance> _players = new...


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

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

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