Форум программистов, компьютерный форум 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" и продолжить программу без ввода?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4315 / 3736 / 1260
Регистрация: 14.04.2014
Сообщений: 14,642
19.11.2014, 17:21     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #2
Три раза прочитал, так и не понял, что ты пытаешься сделать? Зачем классы ссылаются друг на друга?
Нет, нельзя.
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
20.11.2014, 15:35  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #3
nmcf, я хочу избавиться в коде от ссылок типа
C++
1
itemlist->item[]
чтобы было так
C++
1
item[]
Добавлено через 1 минуту
т.е. как у using namespace std
если писать без него будет std::cout<<"text"<<std::endl;
а если в начале написать using namespace std
то можно будет писать просто cout<<"text"<<endl;
я хочу так же сделать, но со своими классами
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.11.2014, 15:47     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #4
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
class Func;
class ItemList
{
public:
    ItemList();
    int   item[48];
    int   count;
 
    Func*func;
}
 
class Func
{
public:
    Func(ItemList&itemlist):count(itemlist.count)
    {
        item = itemlist.item;
    }
    ItemList*itemlist;
    bool AddItem(int id);
    void Clear();
private:
    int & count;
    int * item;
}
примерно так

Добавлено через 2 минуты
тогда можно будет писать вот так
C++
1
2
3
4
5
6
bool Func::AddItem(int id)
{
    if (count>=48)return false;
    item[count++]=id;
    return true;
}
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
20.11.2014, 16:29  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #5
aLarman, а можно попподробней объяснить, как это работает?
class Func
{
public:
Func(ItemList&itemlist):count(itemlist.count)
{
item = itemlist.item;
}

ItemList*itemlist;
bool AddItem(int id);
void Clear();
private:
int & count;
int * item;
}
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
20.11.2014, 17:04     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #6
Цитата Сообщение от Segaman Посмотреть сообщение
Func(ItemList&itemlist):count(itemlist.count)
{
item = itemlist.item;
}
поля-атрибуты объекта типа Func инициализируются (одна через список инициализации, вторая - в теле конструктора) полями объекта ItemList, переданного в конструктор по ссылке

Добавлено через 2 минуты
это можно переписать так:
C++
1
2
3
4
5
Func(ItemList& itemlist)
{
   count = itemlist.count;
   item = itemlist.item;
}
или так:
C++
1
2
3
4
5
Func(ItemList& itemlist)
{
   count(itemlist.count);
   item(itemlist.item);
}
или так:
C++
1
2
Func(ItemList& itemlist) : count(itemlist.count), item(itemlist.item)
{}
много как, короче
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.11.2014, 17:10     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #7
mss307, первые 2 варианта не подойдут, ссылка должна инициализироваться в списке инициализации

Добавлено через 1 минуту
ну а второй вариант вообще не будет работать
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
20.11.2014, 17:10     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #8
Цитата Сообщение от aLarman Посмотреть сообщение
mss307, первые 2 варианта не подойдут, ссылка должна инициализироваться в списке инициализации
ой, блин, согласен на все 100. столько count развели тут, блин.

Цитата Сообщение от aLarman Посмотреть сообщение
ну а второй вариант вообще не будет работать
пппфффф, пора мне домой. второй вариант можно было и не выделять, первый же тоже работать не будет)
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.11.2014, 17:15     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #9
Цитата Сообщение от Segaman Посмотреть сообщение
aLarman, а можно попподробней объяснить, как это работает?
суть в том что, в класс Func (cтранное название вообще то), мы объявляем переменные с такими же именами что и в классе ItemList, и создаем на них ссылки, для count - ccылка на int т.е int&count;
а для item указатель на начало массива т.е int*item, и соответственно в конструкторе Func ссылку инициализируем переменно ItemList::count, а указатель началом на массив item

Добавлено через 1 минуту

Не по теме:

Так же рекомендую, если Вам интересно почитать про список инициализации конструктора

true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
20.11.2014, 17:39     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #10
C++
1
int * item = itemlist->item;
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
21.11.2014, 12:04  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #11
Огромное спасибо всем.
Вы спасли меня
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
28.11.2014, 11:04  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #12
А как сделать например ссылку на функцию?
чтобы вместо Func->Add() вызывать просто Add()?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.11.2014, 11:40     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #13
да
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Func
{
public:
    Func(ItemList&itemlist):count(itemlist.count)
    {
        item = itemlist.item;
        Add  = &ItemList::Add;
    }
    ItemList*itemlist;
    bool AddItem(int id);
    void Clear();
private:
    int & count;
    int * item;
    void (ItemList:: * Add)();
};
Добавлено через 2 минуты
А нет, Вызов все равно будет такой (itemlist->*Add)();
ну все логично, всегда надо указывать объект для которого вызывается ф-ция член

Добавлено через 1 минуту
ну или завернуть этот вызов в ф-цию слен класса Func

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Func
{
public:
    Func(ItemList&itemlist):count(itemlist.count)
    {
        item = itemlist.item;
        Add  = &ItemList::Add;
    }
    ItemList*itemlist;
    bool AddItem(int id)
    {
        Add();
    }
    void Clear();
private:
    void Add()
    {
        itemlist->Add();
    }
    int & count;
    int * item;
};
Добавлено через 2 минуты
чет я не щдля того класса сделал, короче, чтобы не писать Func->Add()
создайте такую же ф-цию в класса, и из нее вызывайте Func->Add()
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
29.11.2014, 13:22  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #14
т.е. ссыку на функцию нельзя получить.
а как же тогда замена кода окна?
C++
1
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)MainWproc);
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
02.12.2014, 10:54  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #15
я просто хотел вместо item->data->recbuff->readuint()
использовать просто конечный readuint()
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
02.12.2014, 11:08     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #16
Цитата Сообщение от Segaman Посмотреть сообщение
т.е. ссыку на функцию нельзя получить.
а как же тогда замена кода окна?
че это можно, тока не ссылку а указатель, проблема в том чтобы ее вызвать нужен объект все равно, либо делать ф-цию не членом класса
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
02.12.2014, 11:33     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #17
Можно через binder'ы сделать, тогда можно будет вызывать метод без указания объекта.
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
04.12.2014, 10:16  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #18
Kastaneda, это сложнее в исполнении.
aLarman, можно поподробнее. очень хотелось бы облегчить код.
а то частенько выходят вот такие вагоны
C++
1
isresult->comment       = file->ReadStr(file->Number(file->ReadPos(4,isresultseek+17),4),NULL);///комментарий
aLarman
636 / 557 / 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);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2014, 15:45     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Segaman
 Аватар для Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 141
04.12.2014, 15:45  [ТС]     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? #20
aLarman, т.е. подругому ReadStr() из класса file вызвать нельзя?
Yandex
Объявления
04.12.2014, 15:45     Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке?
Ответ Создать тему
Опции темы

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