Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Я в этом не шарю
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
1

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

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

Author24 — интернет-сервис помощи студентам
скажем есть 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2014, 11:45
Ответы с готовыми решениями:

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

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

Корректно ли использовать ссылку без контента?
Доброго времени. Корректно ли использовать ссылку без контента? a::after {content: "Читать...

Как удалить GET параметры в ссылке, и сразу новую, удалённую ссылку, без перезагрузки страницы, отразить на сайте?
Есть такой код: if($_GET==10) { if (empty($_SESSION) and empty($_SESSION)) { ...

32
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
19.11.2014, 17:21 2
Три раза прочитал, так и не понял, что ты пытаешься сделать? Зачем классы ссылаются друг на друга?
Нет, нельзя.
0
Я в этом не шарю
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
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
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
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
Я в этом не шарю
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
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
118 / 118 / 41
Регистрация: 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
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
20.11.2014, 17:10 7
mss307, первые 2 варианта не подойдут, ссылка должна инициализироваться в списке инициализации

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

Цитата Сообщение от aLarman Посмотреть сообщение
ну а второй вариант вообще не будет работать
пппфффф, пора мне домой. второй вариант можно было и не выделять, первый же тоже работать не будет)
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
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
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
20.11.2014, 17:39 10
C++
1
int * item = itemlist->item;
0
Я в этом не шарю
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
21.11.2014, 12:04  [ТС] 11
Огромное спасибо всем.
Вы спасли меня
0
Я в этом не шарю
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
28.11.2014, 11:04  [ТС] 12
А как сделать например ссылку на функцию?
чтобы вместо Func->Add() вызывать просто Add()?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
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
Я в этом не шарю
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
29.11.2014, 13:22  [ТС] 14
т.е. ссыку на функцию нельзя получить.
а как же тогда замена кода окна?
C++
1
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)MainWproc);
0
Я в этом не шарю
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
02.12.2014, 10:54  [ТС] 15
я просто хотел вместо item->data->recbuff->readuint()
использовать просто конечный readuint()
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
02.12.2014, 11:08 16
Цитата Сообщение от Segaman Посмотреть сообщение
т.е. ссыку на функцию нельзя получить.
а как же тогда замена кода окна?
че это можно, тока не ссылку а указатель, проблема в том чтобы ее вызвать нужен объект все равно, либо делать ф-цию не членом класса
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,115
Записей в блоге: 2
02.12.2014, 11:33 17
Можно через binder'ы сделать, тогда можно будет вызывать метод без указания объекта.
0
Я в этом не шарю
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
04.12.2014, 10:16  [ТС] 18
Kastaneda, это сложнее в исполнении.
aLarman, можно поподробнее. очень хотелось бы облегчить код.
а то частенько выходят вот такие вагоны
C++
1
isresult->comment       = file->ReadStr(file->Number(file->ReadPos(4,isresultseek+17),4),NULL);///комментарий
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
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);
0
Я в этом не шарю
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191
04.12.2014, 15:45  [ТС] 20
aLarman, т.е. подругому ReadStr() из класса file вызвать нельзя?
0
04.12.2014, 15:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2014, 15:45
Помогаю со студенческими работами здесь

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

Вывод значения DisplayMember, зная его ValueMember
Возникла проблема. Есть 3 combobox и бд. Все три имеют &quot;общий&quot; ValueMember и различный...

Как можно объявить класс, заранее не зная его тип template.
Класс: template &lt;class type&gt; class My { private: int n; double sum; type *al; public:...

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

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

Есть ли способ узнать, что данные отправляются без нашего ведома?
Здравствуйте, можете подсказать, есть ли способ на C# (может на каком еще языке, неважно) узнать,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru