Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2011, 22:40   #1
Anubys
Форумчанин
 
Регистрация: 08.05.2010
Сообщений: 177
По умолчанию h файлы для классов

Написал следующий хедер с таким кодом:
Код:
#include <iostream>
#include <conio>
#include <fstream>

using namespace std;


#ifndef _Flower_h_
#define _Flower_h_

class Flower
{
   private:
      int pelustok;
      string month;
   protected:
      string color;
   public:
      string title;
      Flower();
      Flower(string _title, string _color,
             string _month, int _pelustok);
      Flower(const Flower& obj);
      ~Flower();
      string SetMonth(){ return month; }
      void SetMonth(string _month){ month = _month; }
      int GetPelustok(){ return pelustok; }
      string GetMonth(){ return month; }
      string GetColor() { return color; }
      string GetTitle() { return title; }
      void SetPelustok(int _pelustok){ pelustok = _pelustok; }
      void SetMonth1(string _month){ month = _month; }
      void SetColor(string _color){ color = _color; }
      void SetTitle(string _title){ title = _title; }
      void SaveToFile(char *file);
      void UploadFromFile(char * file);
      void CMD();
      void Display();
      bool operator>(Flower& obj);
      bool operator<(Flower& obj);
      bool operator==(Flower& obj);
      Flower& operator=(Flower& obj);
      friend istream& operator>>(istream& ist, Flower& obj);
      friend ostream& operator<<(ostream& ost, Flower& obj);
};

#endif
Описание методов виложу в следующем посте

Последний раз редактировалось Anubys; 30.11.2011 в 22:44.
Anubys вне форума Ответить с цитированием
Старый 30.11.2011, 22:40   #2
Anubys
Форумчанин
 
Регистрация: 08.05.2010
Сообщений: 177
По умолчанию

Код:
#include "Flower.h"

Flower::Flower()
{
   this->month    = "April";
   this->pelustok = 10;
   this->color    = "Red";
   this->title    = "Roza";
}

Flower::Flower(string _title, string _color, string _month, int _pelustok)
{
   this->title = _title;
   this->color = _color;
   this->month = _month;
   this->pelustok = _pelustok;
}

Flower::Flower(const Flower& obj)
{
   this->pelustok = obj.pelustok;
   this->month    = obj.month;
   this->color    = obj.color;
   this->title    = obj.title;
}

Flower::~Flower()
{
   this->pelustok = NULL;
   this->month.clear();
   this->color.clear();
   this->title.clear();
}

void Flower::SaveToFile(char *file)
{
   ofstream fil(file, ios::out | ios::app);

   fil << this->title    << "\t"
       << this->color    << "\t"
       << this->month    << "\t"
       << this->pelustok << "\n";

   fil.close();
}

void Flower::UploadFromFile(char *file)
{
   ifstream fil(file);

   fil >> this->title
       >> this->color
       >> this->month
       >> this->pelustok;

   fil.close();
}

void Flower::CMD()
{
   string temp;
   int temp1;

   cout << "Enter title flower -> ";
   cin >> temp;

   if(temp.length() > 0)
   {
      this->title = temp;
   }

   cout << "Enter color -> ";
   cin >> temp;

   if(temp.length() > 0)
   {
      this->color = temp;
   }

   cout << "Enter month -> ";
   cin >> temp;

   if(temp != "1")
   {
      this->SetMonth(temp);
   }else
       {
          cout << this->SetMonth() << endl;
       }

   cout << "Enter number of pelustok -> ";
   cin >> temp1;

   if(temp1 != NULL)
   {
      this->pelustok = temp1;
   }
}

void Flower::Display()
{
   cout << this->title     << "\t"
        << this->color     << "\t"
        << this->month     << "\t"
        << this->pelustok  << "\n";
}

bool Flower::operator>(Flower& obj)
{
   if(this->pelustok > obj.pelustok)
   {
      return true;
   }else
       {
          return false;
       }
}

bool Flower::operator<(Flower& obj)
{
   if(this->pelustok < obj.pelustok)
   {
      return true;
   }else
       {
          return false;
       }
}

bool Flower::operator==(Flower& obj)
{
   if(this->pelustok == obj.pelustok)
   {
      return true;
   }else
       {
          return false;
       }
}

Flower& Flower::operator=(Flower& obj)
{
   this->pelustok = obj.pelustok;
   this->month    = obj.month;
   this->color    = obj.color;
   this->title    = obj.title;

   return *this;
}

istream& operator>>(istream& ist, Flower& obj)
{
   ist >> obj.title;
   ist >> obj.color;
   ist >> obj.month;
   ist >> obj.title;

   return ist;
}

ostream& operator<<(ostream& ost, Flower& obj)
{
   ost << obj.title    << "\t"
       << obj.color    << "\t"
       << obj.month    << "\t"
       << obj.pelustok;

   return ost;
}
Линковщик выбрасывает такое:
Код:
[Linker Error] Unresolved external 'Flower::~Flower()' referenced from F:\C++\ООП\L04 - ПЕРЕВАНТАЖЕННЯ ОПЕРАТОРІВ\UNITS\ULAB4.OBJ
[Linker Error] Unresolved external 'Flower::Flower()' referenced from F:\C++\ООП\L04 - ПЕРЕВАНТАЖЕННЯ ОПЕРАТОРІВ\UNITS\ULAB4.OBJ
[Linker Error] Unresolved external 'Flower::Flower(_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, _STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, _STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, int)' referenced from F:\C++\ООП\L04 - ПЕРЕВАНТАЖЕННЯ ОПЕРАТОРІВ\UNITS\ULAB4.OBJ
[Linker Error] Unresolved external 'Flower::operator ==(Flower&)' referenced from F:\C++\ООП\L04 - ПЕРЕВАНТАЖЕННЯ ОПЕРАТОРІВ\UNITS\ULAB4.OBJ
[Linker Error] Unresolved external 'Flower::operator >(Flower&)' referenced from F:\C++\ООП\L04 - ПЕРЕВАНТАЖЕННЯ ОПЕРАТОРІВ\UNITS\ULAB4.OBJ
В чем проблема?
IDE C++ Builder

Последний раз редактировалось Anubys; 30.11.2011 в 22:45.
Anubys вне форума Ответить с цитированием
Старый 30.11.2011, 23:03   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вероятно cpp не является частью проекта?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.11.2011, 23:08   #4
Anubys
Форумчанин
 
Регистрация: 08.05.2010
Сообщений: 177
По умолчанию

Спасибо этого я не учел

Еще один вопрос, если бы я хотел скажем унаследовать этот класс и также захотел отвести отдельный файл для этого класса, то в новый хедер мне нужно просто подключить файл Flower.h и все?

И еще такое, такая вот ситуация:
Я бы хотел чтобы унаследованный класс имел другое поведение скажем оператора сдвига, или какой либо оператор с логических, а он у меня уже унаследованный от предка как мне это реализовать?

Последний раз редактировалось Anubys; 30.11.2011 в 23:13.
Anubys вне форума Ответить с цитированием
Старый 30.11.2011, 23:15   #5
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Из-за пренебрежения константностью объектов и методов использование такого класса может приодить к ошибкам компиляции в безобидных метсах кода.
_Ч_ вне форума Ответить с цитированием
Старый 30.11.2011, 23:23   #6
Anubys
Форумчанин
 
Регистрация: 08.05.2010
Сообщений: 177
По умолчанию

Учусь на ошибках, я еще не профи.

А относительно вопросов изменения поведения операторов предка есть мысли обшарил литературу которую имею и ничего не нашел.
Если кто где-то читал такое пидкиньте ссилочку на книгу

Последний раз редактировалось Anubys; 01.12.2011 в 00:21.
Anubys вне форума Ответить с цитированием
Старый 01.12.2011, 07:29   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Anubys Посмотреть сообщение
Я бы хотел чтобы унаследованный класс имел другое поведение скажем оператора сдвига, или какой либо оператор с логических, а он у меня уже унаследованный от предка как мне это реализовать?
В каком это месте операторы унаследованы от предка?
1. Они принимают ссылки на объекты типа Flower и ничто не мешает добавить новые операторы, которые будут принимать новый тип
2. Никто не мешает добавить виртуальные методы типа:
Код:
int Compare(Flower &obj)
{
  // Сравнение двух объектов
  if (pelustok > obj.pelustok)
    return 1;
  else if (pelustok < obj.pelustok)
    return -1;

  return 0;
  // Если this < obj, возвращаем -1.
  // Если Больше - возвращаем 1.
  // Если объекты одинаковы - 0.
  // Как в strcmp в общем.
}
Операторы уже станут какими-то такими:
Код:
bool Flower::operator>(Flower& obj)
{
   return (Compare(obj) == 1);
}

bool Flower::operator<(Flower& obj)
{
   return (Compare(obj) == -1);
}

bool Flower::operator==(Flower& obj)
{
   return (Compare(obj) == 0);
}
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
uml диаграмма классов для игры den790 Общие вопросы по программированию, компьютерный форум 0 09.10.2011 14:54
Шаблоны. Создать отедльный конструктор копирования для типов, другой для классов TwiX Общие вопросы C/C++ 3 19.09.2010 16:29
Структура классов для РПГ NikSa Gamedev - cоздание игр: Unity, OpenGL, DirectX 10 22.06.2010 06:38
Чтение/запись объектов классов из/в бинарные файлы Гром Общие вопросы C/C++ 9 18.05.2010 22:20
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18