Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

19.11.2014, 11:45. Просмотров 724. Ответов 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Нужно скопировать файл,зная только его название,но не зная расширения.

32
nmcf
5557 / 4867 / 1650
Регистрация: 14.04.2014
Сообщений: 19,758
19.11.2014, 17:21 #2
Три раза прочитал, так и не понял, что ты пытаешься сделать? Зачем классы ссылаются друг на друга?
Нет, нельзя.
0
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 146
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;
я хочу так же сделать, но со своими классами
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
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;
}
0
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 146
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;
}
0
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)
{}
много как, короче
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
20.11.2014, 17:10 #7
mss307, первые 2 варианта не подойдут, ссылка должна инициализироваться в списке инициализации

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

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

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

Не по теме:

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

0
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
20.11.2014, 17:39 #10
C++
1
int * item = itemlist->item;
0
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 146
21.11.2014, 12:04  [ТС] #11
Огромное спасибо всем.
Вы спасли меня
0
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 146
28.11.2014, 11:04  [ТС] #12
А как сделать например ссылку на функцию?
чтобы вместо Func->Add() вызывать просто Add()?
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
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()
0
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 146
29.11.2014, 13:22  [ТС] #14
т.е. ссыку на функцию нельзя получить.
а как же тогда замена кода окна?
C++
1
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)MainWproc);
0
Segaman
2 / 2 / 1
Регистрация: 03.09.2014
Сообщений: 146
02.12.2014, 10:54  [ТС] #15
я просто хотел вместо item->data->recbuff->readuint()
использовать просто конечный readuint()
0
02.12.2014, 10:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2014, 10:54
Привет! Вот еще темы с ответами:

Как узнать 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&lt;L2PcInstance&gt; _players = new...


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

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

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