Пример класса для работы с очередью.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
ip
Сообщения: 7
Зарегистрирован: 12 янв 2005, 03:54
Контактная информация:

Это попытка реализовать класс для работы с очередью сообщений.
Сообщение задается в виде структуры, которая содержит указатель
на следующий элемент (такую же структуру).
Хотелось бы узнать, на сколько правильно это организовано,
плюс, что на счет структур с точки зрения именно С++?

Были бы интересны замечания.

============================BEGIN============================

Код: Выделить всё

#ifndef QUEUE_H
#define QUEUE_H

// Message structure
struct queueNodeStruct {
  char to[128];
  char message[512];
  struct queueNodeStruct *nextPtr;
};

typedef struct queueNodeStruct queueNode;
typedef queueNode *queueNodePtr;



// Queue class
class queueClass {
  private:
    queueNodePtr headPtr;
    queueNodePtr tailPtr;

  public:
    queueClass( );
    int isEmpty( queueNodePtr );
    void dequeue( );
    void enqueue( char [], char []);
    queueNodePtr queueHead( );
    queueNodePtr queueTail( );
};


// Constructor
queueClass::queueClass( ) {

  headPtr = NULL;
  tailPtr = NULL;
}


// Queue is empty?
int queueClass::isEmpty( queueNodePtr headPtr ) {

  return headPtr == NULL;
}


// Enqueue -- add message to queue
void queueClass::enqueue( char to[], char msg[]) {
  queueNodePtr newPtr;

  newPtr = new queueNode;
  if( newPtr != NULL ) {
    strncpy( newPtr->to, to, 128 );
    strncpy( newPtr->message, msg, 512 );
    newPtr->nextPtr = NULL;
    if( isEmpty( headPtr ) ) {
      headPtr = newPtr;
    }
    else {
      tailPtr->nextPtr = newPtr;
    }
    tailPtr = newPtr;
  }
  else {
    std::cout << "Cannot allocate memory in queue for new item.\n";
  }
}


// Dequeue -- remove message from queue
void queueClass::dequeue( ) {
  queueNodePtr nodeToDel;

  if( !isEmpty( headPtr ) ) {
    nodeToDel = headPtr;
    headPtr = headPtr->nextPtr;
    if( headPtr == NULL ) {
      tailPtr = NULL;
    }
    delete nodeToDel;
  }
}


// Get head pointer
queueNodePtr queueClass::queueHead( ) {

  return headPtr;
}


// Get tail pointer
queueNodePtr queueClass::queueTail( ) {

  return tailPtr;
}

#endif
=============================END=============================



И пример работы с очередью, конечно примитивный, но просто
для проверки работы :-)

============================BEGIN============================

Код: Выделить всё

#include <iostream>
#include "queue.h"

void instructions( void );
void printQueue( queueNodePtr currentNode );


int main() {
  queueClass queue;
  int choice;
  char to[128], msg[512];


  instructions();
  std::cout << "? ";
  std::cin  >> choice;

  while( choice != 3 ) {
    switch( choice ) {
      case 1:
        std::cout << "Message to: ";
        std::cin  >> to;
        std::cout << "Message: ";
        std::cin  >> msg;
        queue.enqueue( to, msg );
        printQueue( queue.queueHead() );
        break;

      case 2:
        queue.dequeue( );
        printQueue( queue.queueHead() );
        break;

      default:
        std::cout << "Invalid choice\n";
        instructions();
        break;
    }

    std::cout << "? ";
    std::cin  >> choice;
  }

  std::cout << "End of run.\n";
  return 0;
}


void instructions( void ) {

  std::cout << "Your choice:\n" << "  1. add item\n" << "  2. remove item\n" << "  3. quit\n";
}


void printQueue( queueNodePtr currentPtr ) {

  if( currentPtr == NULL ) {
    std::cout << "Queue is empty" << std::endl;
  }
  else {
    std::cout << "The queue is:" << std::endl;
    while( currentPtr != NULL ) {
      std::cout << currentPtr->to << " -> [" << currentPtr->message << "]" << std::endl;
      currentPtr = currentPtr->nextPtr;
    }
  }
}
=============================END=============================
Styopa
Сообщения: 40
Зарегистрирован: 30 сен 2004, 19:22
Откуда: Севастополь
Контактная информация:

ip писал(а):Хотелось бы узнать, на сколько правильно это организовано,
плюс, что на счет структур с точки зрения именно С++?
ip, не обижайся, плз, но отладка собственного кода - интимное дело самого программиста. Скомпиль и проверь - работает или нет. Вот тогда, если будут проблемы, и обращайся. А насчет структур с точки зрения С++ - это вещь полезная... :lol:
В жизни программиста всего три плюса. Из них два - в Си++, а третий - крест на его могиле.
ip
Сообщения: 7
Зарегистрирован: 12 янв 2005, 03:54
Контактная информация:

:-) Я то не обижаюсь, и не прошу отлаживать и запускать, просто интересно было узнать что качается структур в С++. С точки зрения С++ поощрается ли использовать структуры либо классы. Т.е. что в данном случае было бы лучше.
Т.е. было просто интересно узнать мнение о коде после беглого просмотра. Так сказать экспресс-оценка.
Но в любом случае спасибо :-)
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

если я не ошибаюсь, то и в плюсах одно неявно реализовано через другое
а по личному опыту
если надо просто хранилище данных - структура, если еще и логика - класс
В SAD - все в SAD.
Styopa
Сообщения: 40
Зарегистрирован: 30 сен 2004, 19:22
Откуда: Севастополь
Контактная информация:

Kolinus, действительно не ошибаешься. По Страуструпу структура есть класс без методов. Да и в памяти один хрен.
ip, и не только с точки зрения С++. Вообще, наиболее прогрессивным современным методом программирования считается реализация классов (или структур, а может даже модных ныне интерфейсов), определение методов взаимодействия объектов, создание самих объектов, и - запуск. Так что, правильным путем идете, товарищи!
Маленькое замечание: удобней и для окружающих, и для самого программера (на себе проверил!) расставлять в коде комментарии. Когда твой проект будет большим, половина кода забудется и там сам черт ногу сломит. Я лично себя к комментариям приучил и всем рекомендую. Удачи!
В жизни программиста всего три плюса. Из них два - в Си++, а третий - крест на его могиле.
ip
Сообщения: 7
Зарегистрирован: 12 янв 2005, 03:54
Контактная информация:

Styopa писал(а):Маленькое замечание: удобней и для окружающих, и для самого программера (на себе проверил!) расставлять в коде комментарии. ...
Это точно. Сам стремлюсь (пытаюсь) к этому.
Ваши ответы дали укзазали направление для дальнейшего изучения.

Большое спасибо.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

А почему бы не воспользоваться уже готовыми контейнерами для динамических массивов данных? Типа vector, list, deque, stack...
Они есть в стандартной библиотеке шаблонов С++ (STL) или в других платформо-зависимых библиотеках, типа MFC. По крайней мере не придётся изобретать и доводить до ума очередной велосипед, а в будущем меньше будет проблем с сопровождением программы.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

WinMain, ну человек очевидно учится, сам не был что ли начинающим? Полезно все попробовать своими руками, развивает воображение :)

Насчет struct C++ vs. class, главное отличие - члены структур по умолчанию public, а у классов - private. Отличий от struct C несколько больше, сводятся они в итоге к тому, что С-структура - просто набор данных. По соглашению, С++структуры стараются использовать в таком же контексте, т.е. когда методы не нужны.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Если интересно узнать, как реализуются подобные контейнеры, то в интернете можно найти по ним готовые решения с исходными текстами и комментариями, хотя бы для того, чтобы посмотреть, как это вообще делается. Или можно книгу хорошую взять по алгоритмам на С++.
От себя лишь сделаю конкретное замечание: в структуру, которая содержит "полезные" данные, связанные с решением конкретной задачи, лучше не помещать указатели на другие объекты, промежуточные переменные и прочие служебные поля. Для этого лучше сделать данную структуру членом какго-нибудь класса, который и будет её "обслуживать", т.е. хранить указатели на другие объекты, методы по добавлению и удалению объектов, вести подсчёт количества объектов и т.д. Лучше этот класс реализовать в виде шаблона, у которого открытым параметром будет тип "рабочей" структуры. Тогда тебе не придётся для каждой новой структуры писать свой отдельный класс с повторяющимся кодом.
Ответить