Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обьекты и классы, поиск значений в массиве обьектов 
V
    Опции темы
Ukrajinec
Дата 26.3.2012, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Еще раз добрый вечер.  
Пишу функцию-елемент которая ищет "свободное место" в масиве обьектов. Я решил за аргумент дать указатель на обьект который потом будет сравниватся с искомими елементами массива.  Да вот беда на выражение 
 *(a+j->ID) компилятор ругается "int j;  выражение должно иметь тип указателя". Обьясните плз как выйти с этой ситуации.


banking.h
Код

class User
{
private:
        int ID;
        int PIN;
        double Money_add;
        double Money;
        void total ()
                { Money += Money_add; }
public:
        User();
        User(const int ind, const int code, double cash);
        ~User() { }
        void Add(int ind, int code, double cash);
        void Get(int ind, int code, double cash);
        void Halt (int ind, int code);
        void Show();
        int Find_free(const User *a, const int i) ;
};

#endif

banking.cpp
Код

#include "StdAfx.h"
#include <iostream>
#include <cstring>

using namespace std;

#include"Banking.h"

...

int Find_free(const User *a, const int i) 
{
    int j=0;
    while ((*(a+j.ID) != 0) || j == i)
    {
        j++;
    }
    if ((j==i) && (*(a+j.ID) != 0))
            cout << "\nIt\'s no free space.";
    else
        return j;
}


Это сообщение отредактировал(а) Ukrajinec - 26.3.2012, 22:03
PM MAIL   Вверх
Ukrajinec
Дата 27.3.2012, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Цитата

*((a+j)->ID) или *(a[j]->ID)

Код

...
while (((*(a[j]->ID)->ID) != 0) || j == i)
{...}

*((a+j)->ID)  Ошибка: "const  User*a; Выражение должно иметь тип указателя"
Код

...
while (((*((a+j)->ID)) != 0) || j == i)
{...}

*((a+j)->ID) Ошибка: "Операнд * должен быть указателем" и  "член User::ID (обьявление из строки 7 ..адрес хидера..) недоступно"
PM MAIL   Вверх
baldina
Дата 27.3.2012, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



a - указатель, доступ к членам a->name
*a - объект на который указывает а, доступ (*a).name
a+i - указатель, доступ к членам (a+i)->name
a[i] - объект на который указывает а+i, доступ к членам a[i].name
Код

a[i].ID


Добавлено через 3 минуты и 4 секунды
Цитата(Ukrajinec @  26.3.2012,  21:53 Найти цитируемый пост)
Пишу функцию-елемент которая ищет "свободное место" в масиве обьектов.

"функция-елемент" называется функцией-членом или методом класса. т.к. Find_free не имеет отношения к конкретному объекту, а работает с параметром a, её лучше сделать статической или вообще свободной, определенной вне класса.

Добавлено через 8 минут и 9 секунд
что возвращает FindFree если места нет?

Добавлено через 12 минут и 10 секунд
циклы вроде
Код

while (*(p+i))
      ++i;
 
возможно будут проще и понятнее, если переписать их как
Код

while (*p)
        ++p;


PM MAIL   Вверх
Ukrajinec
Дата 29.3.2012, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Извините что так долго не отписовал, просто не позволяло время. Значит так вот несколько скринов по вариантам записи обьекта через указатель..
user posted image
user posted image

Цитата

что возвращает FindFree если места нет?

Суть сейчас не в том что возвращает функция, а в чем ошибка. Что будет возвращать функция придумается после того как она начнет работать.

Цитата

Код

while (*p)
        ++p;


Интересный метод записи, возьму на вооружение, спасибо. Но как тут его вписать я не знаю. Причина в том что цикл while должен работать до тех пор пока не встретися "0" или пока j не станет равным количеству елементов в массиве. А запись типа 
Код

...
while (*p || j!=i)
...

возвращает ошибку...(
PM MAIL   Вверх
baldina
Дата 1.4.2012, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Код

int Find_free (const User *a, int size) 
{
    for (const User *p = a, *end = p+size; p != end; ++p)
       if (p->ID == 0)
         return end-p;

    // Log: "It's no free space."
    return -1;
}

а вообще в С++ для этого есть стандартные средства http://www.cplusplus.com/reference/algorithm/find/

PM MAIL   Вверх
Ukrajinec
Дата 1.4.2012, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



снова User::ID недоступен(( ппробую переписать с чистого листа...
PM MAIL   Вверх
Ukrajinec
Дата 1.4.2012, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Блин не получается и всё, ошибка идентична той что на 1-ом скрине((
Может я как то не правильн осозаю проект?..

Это сообщение отредактировал(а) Ukrajinec - 1.4.2012, 22:58
PM MAIL   Вверх
mes
Дата 2.4.2012, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Ukrajinec, или открыть ID, или объявить другом функцию поиска..

Добавлено через 5 минут и 58 секунд
Цитата(Ukrajinec @  26.3.2012,  20:53 Найти цитируемый пост)
class User
{
private:
        int ID;
        int PIN;
        double Money_add;
        double Money;
        void total ()


имя класса не очень отражает действительность.. 


--------------------
PM MAIL WWW   Вверх
Ukrajinec
Дата 2.4.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



mes
Цитата

, или объявить другом функцию поиска.. 


Это как? Я еще так не знаю. Расскажи или дай ссилку на материал плз...
PM MAIL   Вверх
mes
Дата 2.4.2012, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250





--------------------
PM MAIL WWW   Вверх
baldina
Дата 2.4.2012, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Ukrajinec, давай отделим мух от котлет.
итак, есть класс User, у него есть атрибуты ID, PIN, Money. Нужно средство для создания объекта класса (конструктор) и методы чтения атрибутов. Для простоты сделаем атрибуты открытыми членами класса, что бы не писать функции get. (В настоящем коде лучше сделать функции)
Код

struct User {
  int PID, PIN;
  double Money;
  User (int PID=0, int PIN=0, double Modey=0) : PID(PID), PIN(PIN), Money(Money) {}
  bool operator==(const User& other) const { return PID==other.PID; }
};

с другой стороны есть множество User'ов, которые хранятся в контейнере (например массиве). Здесь можно пойти двумя путями: написать контейнер и функции доступа к нему самостоятельно или использовать средства стандартной библиотеки STL.
с использованием STL:
в качестве контейнера используем стандартный вектор std::vector<User>. к нему можно обращаться как к массиву
в качестве "удаления" элемента будем записывать элемент со значением по умолчанию, с нулевыми данными
в качестве поиска - стандартную функцию std::find

в любом случае имеются две сущности - объекты типа User и контейнер User'ов типа
Код

class Users {
public:
        void Add(const User&);
        User Get(int ind) const;
        void Halt (int ind);
        int Find_free() const;
};

если, например, для хранения пользователей используется обычный массив размера n, то искомая функция могла бы быть такая:
Код

class Users {
  User users[n];
  ....
  public:
    int Find_free () const {
      User* pu = std::find (users, users+n, User());
      if (pu != users+n)
        return pu-users;
      else
        return -1;
    }
  ....
};

PM MAIL   Вверх
Ukrajinec
Дата 5.4.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



К векторам и "друзьям" мне еще примерно 70 стрниц читать.)) Отложу пока эту роботу до тех пор пока не выучу материал хотябы до этих пунктов)
Спс за помощь...

Это сообщение отредактировал(а) Ukrajinec - 5.4.2012, 14:39
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2285 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.