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

классы/дочерние классы/методы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.96
LilyRose
 Аватар для LilyRose
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 14
13.01.2011, 17:08     классы/дочерние классы/методы #1
помогите пожалуйста! надо что выводились только учебеники. чтоб былo через GetTip.


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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class Book
{   
  protected:
    char *name,*avtor;
    int str;
 
  public:
      Book(){name=0;str=0;avtor=0;}  
      Book(char *n,char *a, int s)
      {
          if(s>0)str=s;else str=0;      
      name=new char[strlen(n)+1];
      strcpy(name,n);
      avtor=new char[strlen(a)+1];
      strcpy(avtor,a);
      } 
 
      ~Book()
      {
         if(name!=0)delete [] name;
         if(avtor!=0)delete [] avtor;
      }
      int GetStr(){return str;}
 
      
      void SetStr( int s)
 
      {
          if(s>0)str=s;
          else str=0;
      }
      char *GetName(){return name;}
      
      void SetName(char *n)
      {
          if(name!=0)delete [] name;
          name=new char[strlen(n)+1];
      strcpy(name,n);
      }
 
      char *GetAvtor(){return avtor;}
      void SetAvtor(char *a)
      {
          if(avtor!=0)delete [] avtor;
          avtor=new char[strlen(a)+1];
      strcpy(avtor,a);
      }
      
      
     virtual void Print()=0;
     };
 
class YchBook:public Book
{
        char *predmet,*tip;
    public:
        YchBook():Book(){predmet=0;tip=0;}
        YchBook(char *n,char*a,int s,char *p,char *t):Book(n,a,s)
        {
                predmet=new char[strlen(p)+1];
                strcpy(predmet,p);
             tip=new char[strlen(t)+1];
                strcpy(tip,t);
        }
         char *GetPredmet(){return predmet;}
      void SetPredmet(char *p)
      {
          if(predmet!=0)delete [] predmet;
          predmet=new char[strlen(p)+1];
      strcpy(predmet,p);
      } 
      
      char *GetTip(){return tip;}
      void SetTip(char *t)
      {
          if(tip!=0)delete [] tip;
          tip=new char[strlen(t)+1];
      strcpy(tip,t);
      }
 
      void Print();
      ~YchBook()
      {
          if(tip!=0)delete [] tip;
           if(predmet!=0)delete [] predmet;
      }
главный срр файл:
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
int i;
 
    Book *b[3];
YchBook S(" studehtu ","Cheshko",200,"algebra","ychebnik");
 S.Print();
S.SetPredmet("russki");
S.SetTip("metodika");
//b=&S;
b[0]=&S;
 
YchBook V(" studentu ", "Ivanov", 90,"Istorija","ychebnik");
V.Print();
b[1]=&V;
 
for (i=0;i<2;i++)
    {if (b[i]->GetTip()="ychebnik")     //   <-----------    ??????
       b[i]->Print();
    }
 
 
............................
    cin>>i;
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.01.2011, 18:01     классы/дочерние классы/методы #2
Одно равно это присваивание, два равно это сравнение. Кроме того, сравнение строк делается через функцию strcmp модуля string.h (cstring в новых версиях с++).
C++
1
2
(b[i]->GetTip()="ychebnik") // присваивание
(strcmp(b[i]->GetTip(), "ychebnik") == 0) // сравнение строк
LilyRose
 Аватар для LilyRose
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 14
13.01.2011, 18:12  [ТС]     классы/дочерние классы/методы #3
спасибо..)

тут еще то, что метод GetTip находится в дочернем классе//
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.01.2011, 18:29     классы/дочерние классы/методы #4
У класса Book нет метода GetTip.
LilyRose
 Аватар для LilyRose
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 14
13.01.2011, 18:39  [ТС]     классы/дочерние классы/методы #5
он есть в дочернем классе YchBook. и дело в том что он и должен оставаться в дочернем..
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.01.2011, 18:44     классы/дочерние классы/методы #6
Если у вас нет метода в родительском классе, вы не можете вызывать его из объекта родительского класса. У вас может быть виртуальный метод в родительском классе.
Какая у вас задача?
LilyRose
 Аватар для LilyRose
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 14
13.01.2011, 19:05  [ТС]     классы/дочерние классы/методы #7
нужно что бы на экран выдавался список (по типу) только учебников. учитывая что они(учебник/методика) есть только в дочернем подклассе YchBook. есть и другой дочерний подкласс, там вообще нет такого свойства. и не знаю как это реализовать(
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.01.2011, 20:09     классы/дочерние классы/методы #8
Через виртуальную функцию, имеющуюся в базовом классе и перегруженную в дочерних классах.
Про виртуальные функции лучше прочитать отдельно в каком-нибудь учебнике.

В следующем примере виртуальная функция ClassCode возвращает признак типа класса, по которому можно определить, какой класс находится в переменной-указателе на родительский класс. Так же присутствует виртуальная функция Print, которая печатает данные класса.
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <cstdio>
#include <cstring>
#include <cstddef>
#include <ctime>
#include <cstdlib>
 
class Book {
 public:
  Book() : name_(NULL), author_(NULL) {}
  Book(const char *name, const char *author)
    : name_(NULL), author_(NULL) {
    set_name(name);
    set_author(author);
  }
  virtual ~Book() {
    if (name_ != NULL) delete name_;
    if (author_ != NULL) delete author_;
  }
  void set_name(const char *name) {
    if (name_ != NULL)
      delete name_;
    name_ = new char[strlen(name) + 1];
    strcpy(name_, name);
  }
  void set_author(const char *author) {
    if (author_ != NULL)
      delete author_;
    author_ = new char[strlen(author) + 1];
    strcpy(author_, author);
  }
  char *name() const { return name_; }
  char *author() const { return author_; }
  inline virtual void Print() {
    printf("Name: %s\nAuthor: %s\n", name_, author_);
  };
  virtual int ClassCode() const {
    return 0;
  }
 private:
  char *name_;
  char *author_;
};
 
class TextBook : public Book {
 public:
  TextBook() : Book(), subject_(NULL) {}
  TextBook(const char *name, const char *author)
    : Book(name, author), subject_(NULL) {
  }
  TextBook(const char *name, const char *author, const char *subject)
    : Book(name, author), subject_(NULL) {
    set_subject(subject);
  }
  ~TextBook() {
    if (subject_ != NULL)
      delete subject_;
  }
  void set_subject(const char *subject) {
    if (subject_ != NULL)
      delete subject_;
    subject_ = new char[strlen(subject) + 1];
    strcpy(subject_, subject);
  }
  char *subject() const {
    return subject_;
  }
  virtual int ClassCode() const {
    return 1;
  }
  inline virtual void Print() {
    Book::Print();
    printf("Subject: %s\n", subject_);
  };
 private:
  char *subject_;
};
 
class AnyBook : public Book {
 public:
  AnyBook() : Book() {}
  AnyBook(const char *name, const char *author)
    : Book(name, author) {}
  virtual int ClassCode() const {
    return 2;
  }
};
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
 
  const int k_book_count = 10;
  Book *books[k_book_count];
 
  for (int i = 0; i < k_book_count; ++i) {
    int random_number = rand() % 3;
    if (random_number == 0)
      books[i] = new Book("Some book", "Some author");
    else
    if (random_number == 1)
      books[i] = new TextBook("Some textbook", "Other author", "A subject.");
    else
    if (random_number == 2)
      books[i] = new AnyBook("Any book", "An author");
  }
 
  for (int i = 0; i < k_book_count; ++i) {
    if (books[i]->ClassCode() == 1)
      books[i]->Print();
  }
 
  for (int i = 0; i < k_book_count; ++i)
    delete books[i];
 
  return 0;
}
LilyRose
 Аватар для LilyRose
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 14
13.01.2011, 22:07  [ТС]     классы/дочерние классы/методы #9
спасибо большое..! но тут что-то совсем всё подругому// от нас требуют ближе к тому..
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.01.2011, 22:17     классы/дочерние классы/методы #10
LilyRose, либо вы говорите отсебятину (типа "и дело в том что он и должен оставаться в дочернем"), либо тот, кто от вас требует "ближе к тому" тупо не понимает, что "ближе к тому" не получится так, как требуют, а получится только через виртуальные методы.

Добавлено через 3 минуты

Не по теме:

lemegeton, кстати, просто интересно: а зачем перед освобождением памяти указатель на равенство 0 проверяете? Ведь применение delete к 0-указателю совершенно безвредно.

lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.01.2011, 22:20     классы/дочерние классы/методы #11
Цитата Сообщение от LilyRose Посмотреть сообщение
но тут что-то совсем всё подругому
И что же тут по-другому? Отформатировано под единый стиль? Говорящие переменные на английском? Да переписывайте, ради Б-га. Подгоняйте под свой стиль.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
lemegeton, кстати, просто интересно: а зачем перед освобождением памяти указатель на равенство 0 проверяете? Ведь применение delete к 0-указателю совершенно безвредно.
По-привычке, наверно, стиль такой. Explicit better that implicit.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2011, 19:30     классы/дочерние классы/методы
Еще ссылки по теме:

Классы. Объекты. Методы C++
C++ Дочерние классы используют переменную базового класса
Классы, функции методы класса, наследование C++

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

Или воспользуйтесь поиском по форуму:
LilyRose
 Аватар для LilyRose
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 14
14.01.2011, 19:30  [ТС]     классы/дочерние классы/методы #12
сделала) добавила несколько строчек в свой код)

спасибо всем)
Yandex
Объявления
14.01.2011, 19:30     классы/дочерние классы/методы
Ответ Создать тему
Опции темы

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