Форум программистов, компьютерный форум CyberForum.ru

Вопрос по классам - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
21.10.2010, 19:52     Вопрос по классам #1
Опишу определение базавого класса и производного
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 Date
{
  private:
           ...
  public:
           Date( ){};
           virtual ~Date(){};
           
           virtual Date& GetDate();  
           Date& dateadd(int, Date&);  
};
 
class DateTime : public Date
{
  private:
           ...
  public:
           DateTime(){};// 
           virtual ~DateTime(){};
           
           virtual DateTime& GetDate();
}; 
 
Date d;
DateTime dt;
хочу для производного класса вызвать метод из класса Date, но класс Date ожидает второй параметр
Date&, но я хочу передать именно DateTime

C++
1
dt.dateadd(5,dt);
, что мне поможет RTTI (dynamic_cast), если да то как это использовать?
Всем спассибо за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2010, 19:52     Вопрос по классам
Посмотрите здесь:

C++ вопрос по классам
C++ Вопрос по классам
книга по классам C++
учебник по классам C++
C++ Вопрос по классам и функциям
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.10.2010, 19:57     Вопрос по классам #2
obuhanoe, static_cast<T> вполне поможет
А если сделать ее виртуальной в базовом - можно и без приведения вроде
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
21.10.2010, 19:58     Вопрос по классам #3
Во-первых, наследование не совсем правильно концептуально. DateTime включает Date, но не наследует.

Если хотите оставить иерархию, переопределите dateadd с новым аргументом DateTime&.
И да, кстати. Что делает функция ? Если есть дата 1.01.2001, что будет, если вы прибавите 5 "1.02.2008" ? Добавиться 5.05.10040 ? Вообще говоря, даты нельзя суммировать. Как и DateTime.
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
21.10.2010, 20:05  [ТС]     Вопрос по классам #4
Andrew_Lvov - функция dateadd работает у меня идентично как функция у MSSQL
берется дата и прибавляется или отнмается дни месяцы годы в зависимости от того что я хочу с ней сделать, я специально не приводит полное описание.

И почему вы пишите что DateTime не наследует Date
C++
1
2
3
class DateTime : public Date
{
};
и в классе DateTime переопределяется GetDate, что же в Вашем понятии тогда наследование?

Lavroff - спасибо!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.10.2010, 20:06     Вопрос по классам #5
obuhanoe, Концепция наследования раскрыта неверно. Только и всего
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
21.10.2010, 20:13     Вопрос по классам #6
obuhanoe, если вам интересно моё мнение, в MYSQL - функция, а у вас - метод класса.
Какая разница? Разница в том, что метод класса подразумевает операцию над объектом класса, если метод, конечно, нестатический.
Если метод не использует данных объекта, для к-рого он вызван, это введёт в заблуждение пользователя класса, не знакомого с реализацией.
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
21.10.2010, 20:17  [ТС]     Вопрос по классам #7
Lavroff - т.е. если я переопределю в производном классе dateadd, наследование будет более полное и верное?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.10.2010, 20:21     Вопрос по классам #8
obuhanoe, Вроде как сама концепция... Но я же не знаю, что у вас обозначают эти два класса.
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
21.10.2010, 20:26  [ТС]     Вопрос по классам #9
Andrew_Lvov - я наверное в общих чертах объяснил как работает dateadd поясню
конструктор Date при инициализации защищенным данным присваивает текущую дата, а при вызове dateadd я увеличиваю или уменьшаю текущую дату и соответсвенно все это храню в private данных
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
21.10.2010, 20:46     Вопрос по классам #10
obuhanoe, если вы изменяете текущую дату (допустим на int дней), зачем тогда второй аргумент ?
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
21.10.2010, 20:50  [ТС]     Вопрос по классам #11
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
зачем тогда второй аргумент ?
согласен, можно его и не использовать, а использовать указатель this.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.10.2010, 20:52     Вопрос по классам #12
obuhanoe, Я бы сказал нужно, если функция - член класса.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
21.10.2010, 20:57     Вопрос по классам #13
Цитата Сообщение от obuhanoe Посмотреть сообщение
хочу для производного класса вызвать метод из класса Date, но класс Date ожидает второй параметр
Date&, но я хочу передать именно DateTime

C++
1
dt.dateadd(5,dt);
, что мне поможет RTTI (dynamic_cast), если да то как это использовать?
Всем спассибо за ответы.
У вас изначально все синтаксически корректно. Указателю и ссылке на базовый класс можно присваивать объекты классов-потомков (указателю адрес, а ссылке - сам объект), так как объект производного класса является в то же время объектом любого из своих классов-предков. На этом, собственно, и зиждется механизм полиморфного поведения классов.
Можно даже объекту базового класса присвоить объект производного класса, но там срезка произойдет.
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
26.10.2010, 17:23  [ТС]     Вопрос по классам #14
ну вот добрался до инета и приведу пример и обяъсните почему у меня так получается...т.е. не верно
*.h
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef CLASS_DATE_H_INCLUDED
#define CLASS_DATE_H_INCLUDED
 
#include <iostream>
#include <ctime>
 
using namespace std;
 
//====================================К==Л==А==С==С==Ы=============================================
// Класс для работы с датой
class Date
{
  public:
           enum Month{jan = 1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec,unk};
 
           Date(int dd = 0, Month mm = Month(0), int year = 0);
 
           //Деструктор
           virtual ~Date(){};
           friend ostream& operator<< (ostream&, const Date&);
 
           //TEST
           void Test(Date&);
 
 
  private:
           int day, year, temp;
           Month month;
 
};
 
//Производный класс от Date
class DateTime : public Date
{
  public:
           DateTime(int dd, Month mm, int yy);
           virtual ~DateTime(){};
           friend ostream& operator<< (ostream&, const DateTime&);
 
  private:
           int dt_day, dt_year, dt_hour, dt_min, dt_sec;
           Month dt_month;
};
 
#endif // CLASS_DATE_H_INCLUDED
1.cpp
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "Class_date.h"
// Описание класса для работы с датой
Date::Date(int dd, Month mm, int yy)
{
    day   = dd;
    month = mm;
    year  = yy;
 
}
 
 
//Дружественная функция для просмотра даты
ostream& operator<<(ostream& os, const Date& d)
{
  string str_d, str_m;
  str_d = str_m = "";
 
  if (d.day   < 10) str_d = "0";
  if (d.month < 10) str_m = "0";
 
  return (os << str_d << d.day << "." << str_m << d.month << "." << d.year);
}
 
 
void Date::Test(Date& da)
{
    temp = da.day;
    cout << da.year << " " <<temp <<endl;
 
}
 
 
//Производный класс от Date
DateTime::DateTime(int dd, Month mm, int yy)
{
  dt_day   = dd;
  dt_month = mm;
  dt_year  = yy;
  dt_hour  = 0;
  dt_min   = 0;
  dt_sec   = 0;
 
}
 
 
ostream& operator<<(ostream& os, const DateTime& dt)
{
  string str_d, str_m;
  str_d = str_m = "";
 
  if (dt.dt_day   < 10) str_d = "0";
  if (dt.dt_month < 10) str_m = "0";
 
  return (os << str_d << dt.dt_day << "." << str_m << dt.dt_month << "." << dt.dt_year << " " << dt.dt_hour << ":" << dt.dt_min << ":" << dt.dt_sec);
 
}
2.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include "Class_date\\Class_Date_realiz.cpp"
 
 
using namespace std;
 
//=================================================================
int main (int argc, char* argv[]) // когда передаем 2 значения
{
 
   Date da(14, Date::Month(3),2007);
   DateTime dt(22,DateTime::Month(11),2009);
 
   da.Test(da);
   dt.Test(dt);
 
 
   return 0;
}
Так вот когда я запускается dt.Test(dt);
данные по нулям выводит, что я не учел....
даже если поределить так
C++
1
2
//TEST
           void Test();
и использовать внутри функции this результат тот же.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.10.2010, 17:27     Вопрос по классам #15
obuhanoe,
C++
1
#include "Class_date\\Class_Date_realiz.cpp"
Мб
C++
1
#include "Class_date.h"
?
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
26.10.2010, 17:39  [ТС]     Вопрос по классам #16
*.h = Class_date.h
1.cpp = Class_Date_realiz.cpp
2.cpp = temp.cpp
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.10.2010, 17:40     Вопрос по классам #17
obuhanoe, НЕ подключайте .cpp файлы через #include...
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
26.10.2010, 17:44  [ТС]     Вопрос по классам #18
а как?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.10.2010, 17:46     Вопрос по классам #19
obuhanoe, А .h файл то подключить почему нет? оО
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2010, 17:48     Вопрос по классам
Еще ссылки по теме:

Вопрос по Классам... C++
C++ Вопрос по классам
C++ У меня вопрос по классам. На приложенных картинках я выделил непонятные строки.

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

Или воспользуйтесь поиском по форуму:
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
26.10.2010, 17:48  [ТС]     Вопрос по классам #20
хотел уточнить проблема в подключении cpp файла или вы мне говорите что так лучше не делать и это не потеме вопроса?
Yandex
Объявления
26.10.2010, 17:48     Вопрос по классам
Ответ Создать тему
Опции темы

Текущее время: 07:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru