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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
#1

Класс игральная карта - C++

29.05.2013, 08:30. Просмотров 1618. Ответов 40
Метки нет (Все метки)

Помогите описать класс карта нужно описать ее масть и номер с двумя конструкторами, один обязательно с параметрами, помогите нужно сделать к завтрашней паре, а да еще конструктор должен обязательно задействован, и пожалуйста с переменными флоат если это возможно, но не со строками..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2013, 08:30     Класс игральная карта
Посмотрите здесь:

Создайте класс Date. Добавить в строковый класс функцию C++
C++ Описать класс "карта"
Как преобразовать указатель на класс к указателю на асбтрактный класс? C++
Указатели в базовом классе на базовый класс и производный класс C++
C++ С++ класс (создайте класс с именем Complex для выполнения в арифмитических операий с комплексными числами))
Класс, для полей которого нужно использовать класс C++
C++ Класс Quadrangle (четырехугольник). Класс хранит Декартовы координаты четырех углов четырехугольника
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 08:43     Класс игральная карта #2
Цитата Сообщение от Karata Посмотреть сообщение
с переменными флоат если это возможно
А что в игральной карте может описываться вещественной переменной? Толщина материала, из которого она сделана?
lemegeton
2917 / 1346 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
29.05.2013, 10:12     Класс игральная карта #3
Цитата Сообщение от Karata Посмотреть сообщение
и пожалуйста с переменными флоат если это возможно
Бессмысленно. Попробуйте сами придумать свойство карты, описывающееся числом с плавающей точкой.

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Card {
 public:
  Card() : suit(0), rank(0) {}
  Card(int suit, int rank) : suit(suit), rank(rank) {}
  int getSuit() const { return suit; }
  int getRank() const { return rank; }
  void setSuit(int suit) { this->suit = suit; }
  void setRank(int rank) { this->rank = rank; }
 private:
  int suit;
  int rank;
};
Добавлено через 12 минут
Пример использования.
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
#include <iostream>
 
class Card {
 public:
  Card() : suit(0), rank(0) {}
  Card(int suit, int rank) : suit(suit), rank(rank) {}
  int getSuit() const { return suit; }
  int getRank() const { return rank; }
  void setSuit(int suit) { this->suit = suit; }
  void setRank(int rank) { this->rank = rank; }
 private:
  int suit;
  int rank;
};
 
 
const char *getCardRankName(int rank) {
  static const char RANK_NAMES[][10] = {"2", "3", "4", "5", "6", "7",
    "8", "9", "10", "jack", "queen", "king", "ace"};
  return RANK_NAMES[rank];
}
 
const char *getCardSuitName(int suit) {
  static const char SUIT_NAMES[][10] = {"spades", "hearts", "diamonds",
    "clubs"};
  return SUIT_NAMES[suit];
}
 
int main(int, char **) {
  
  for (int suit = 0; suit < 4; ++suit) {
    for (int rank = 0; rank < 13; ++rank) {
      Card card(suit, rank);
      std::cout << getCardRankName(card.getRank()) << " of " <<
        getCardSuitName(card.getSuit()) << std::endl;
    }
  }
 
  return 0;
}
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
29.05.2013, 13:55  [ТС]     Класс игральная карта #4
Цитата Сообщение от lemegeton Посмотреть сообщение
Бессмысленно. Попробуйте сами придумать свойство карты, описывающееся числом с плавающей точкой.

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Card {
 public:
  Card() : suit(0), rank(0) {}
  Card(int suit, int rank) : suit(suit), rank(rank) {}
  int getSuit() const { return suit; }
  int getRank() const { return rank; }
  void setSuit(int suit) { this->suit = suit; }
  void setRank(int rank) { this->rank = rank; }
 private:
  int suit;
  int rank;
};
Добавлено через 12 минут
Пример использования.
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
#include <iostream>
 
class Card {
 public:
  Card() : suit(0), rank(0) {}
  Card(int suit, int rank) : suit(suit), rank(rank) {}
  int getSuit() const { return suit; }
  int getRank() const { return rank; }
  void setSuit(int suit) { this->suit = suit; }
  void setRank(int rank) { this->rank = rank; }
 private:
  int suit;
  int rank;
};
 
 
const char *getCardRankName(int rank) {
  static const char RANK_NAMES[][10] = {"2", "3", "4", "5", "6", "7",
    "8", "9", "10", "jack", "queen", "king", "ace"};
  return RANK_NAMES[rank];
}
 
const char *getCardSuitName(int suit) {
  static const char SUIT_NAMES[][10] = {"spades", "hearts", "diamonds",
    "clubs"};
  return SUIT_NAMES[suit];
}
 
int main(int, char **) {
  
  for (int suit = 0; suit < 4; ++suit) {
    for (int rank = 0; rank < 13; ++rank) {
      Card card(suit, rank);
      std::cout << getCardRankName(card.getRank()) << " of " <<
        getCardSuitName(card.getSuit()) << std::endl;
    }
  }
 
  return 0;
}
Можете рассказать где именно используется конструктор с параметрами!
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 14:06     Класс игральная карта #5
Цитата Сообщение от Karata Посмотреть сообщение
Можете рассказать где именно используется конструктор с параметрами!
строка 33.
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
29.05.2013, 14:08  [ТС]     Класс игральная карта #6
Цитата Сообщение от Tulosba Посмотреть сообщение
строка 33.
А конструктор без параметров я так понял не используется
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 14:33     Класс игральная карта #7
Цитата Сообщение от Karata Посмотреть сообщение
А конструктор без параметров я так понял не используется
В примере - нет.
Можно, кстати, из двух конструкторов сделать один:
C++
1
Card(int suit=0, int rank=0) : suit(suit), rank(rank) {}
lemegeton
2917 / 1346 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
29.05.2013, 15:57     Класс игральная карта #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно, кстати, из двух конструкторов сделать один:
Можно, но плохой стиль.
Karata
0 / 0 / 0
Регистрация: 29.05.2013
Сообщений: 40
29.05.2013, 16:15  [ТС]     Класс игральная карта #9
Спасибо всем за помощь, еще можете помочь, нужно описать производный класс,содержащий поле козырь и функцию, проверяющую кроет ли карта указанную в качестве параметра другую карту с учетом козыря.
Я так понял это наследование...
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 16:17     Класс игральная карта #10
Цитата Сообщение от lemegeton Посмотреть сообщение
Можно, но плохой стиль.
Не могли бы поконкретнее?
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
29.05.2013, 16:33     Класс игральная карта #11
Не сказал бы что Tulosba тут придерживается плохого стиля (если говорить общо), но в данном контексте - да, неудачный вариант. Но и предложенный by lemegeton c конструктором без аргументов - тоже неудачный. Если мы работаем с такой предметной областью, то трудно себе представить карту с:

1. отсутствующим хотя бы одним из 2-х ключевых (для карты - неотъемлемых) атрибутов
2. с атрибутами, заданными по умолчанию

Посему - единственных хороший вариант - мы ведь хотим, чтобы объект всегда был доступен для корректного использования - предоставить конструктор, требующий указать оба атрибута явно.

А чтобы еще краше было, завести для них enum'ы для более жесткого контроля типов.
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 16:43     Класс игральная карта #12
ITcrusader, я согласен с тем, что конструктор без параметров в данном случае довольно странная затея. Но если уж он есть (и считать, что он нужен и полезен), и есть конструктор с параметрами (который тоже нужен и полезен), то почему бы не объединить их в один с параметрами по умолчанию. Вот это для меня не понятно, и именно это я просил прояснить.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
29.05.2013, 16:50     Класс игральная карта #13
Tulosba, ну да) Я потому и был осторожен и написал
Цитата Сообщение от ITcrusader Посмотреть сообщение
(если говорить общо)


Например для точки 3D - очень даже удобно завести конструктор такой:
C++
1
Point( double x = 0, double y = 0, double z = 0);
Работая в 2D плоскости просто юзаем так:
C++
1
Point point( 3.23, 2.32 );
словно и нет 3-го измерения, удобно, интуитивно понятно, лишено недостатков, как мне кажется.

так что мне тоже интересно, почему это - признак плохого стиля
lemegeton
2917 / 1346 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
29.05.2013, 17:04     Класс игральная карта #14
Цитата Сообщение от ITcrusader Посмотреть сообщение
Но и предложенный by lemegeton c конструктором без аргументов - тоже неудачный.
Цитата Сообщение от Tulosba Посмотреть сообщение
ITcrusader, я согласен с тем, что конструктор без параметров в данном случае довольно странная затея.
Джентльмены, вы не понимаете, для чего нужен конструктор без аргументов? Поясню:
C++
1
2
std::vector<Card> v(5); // массив из пяти карт
Card fiveCards[5]; // а так?
Конечно, хорошо, когда нет конструктора по-умолчанию и все параметры задаются явно. Но такое не всегда возможно.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
29.05.2013, 17:10     Класс игральная карта #15
Понятно, для чего он нужен)

Непонятно, почему это:

Цитата Сообщение от Tulosba Посмотреть сообщение
Можно, кстати, из двух конструкторов сделать один:
C++
1
Card(int suit=0, int rank=0) : suit(suit), rank(rank) {}
названо плохим стилем (тоже дает возможность создания массивов, векторов, как описано выше).
MrGluck
29.05.2013, 17:11
  #16

Не по теме:

Не мой код - говнокод

Дело вкуса

lemegeton
2917 / 1346 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
29.05.2013, 17:33     Класс игральная карта #17
Цитата Сообщение от ITcrusader Посмотреть сообщение
названо плохим стилем (тоже дает возможность создания массивов, векторов, как описано выше).
Плохим стилем является объявление значений по-умолчанию для конструктора. Долго и нудно разглагольствовать, может быть позже у меня будет демагогическое настроение. В двух словах -- усложняет поддержку кода.

Добавлено через 3 минуты
Естественно, земля вертится, количество вариантов бесконечно, так что бывают случаи, когда конструкторы с дефолтными значениями параметров оправданы. Да и вообще, опыт появляется от прыганья по граблям. Так что никакой демагогии не дождетесь -- пишите, как считаете нужным.
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 21:03     Класс игральная карта #18
Разница, которую я вижу в отличии кода с двумя конструкторами:
C++
1
2
Card() : suit(0), rank(0) {}
Card(int suit, int rank) : suit(suit), rank(rank) {}
от кода с одним, но с параметрами по умолчанию:
C++
1
Card(int suit=0, int rank=0) : suit(suit), rank(rank) {}
Это, как минимум, добавление во втором случае возможности вызова, конструктора с одним параметром, что может быть использовано для неявного преобразования int в Card.
В некоторых случаях это нежелательно. Однако, добавление explicit к конструктору позволит исключить возможность такого преобразования:
C++
1
excplicit Card(int suit=0, int rank=0) : suit(suit), rank(rank) {}
Чем ещё может усложнить поддержку кода наличие параметров по умолчанию в конструкторе, мне не ясно.
Надеюсь, уважаемый lemegeton всё же снизойдет до подробностей.
Можно даже без демагогии, но с конкретными примерами.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
29.05.2013, 21:40     Класс игральная карта #19
lemegeton, я, в свою очередь, могу сказать, что дискуссию тож неохота разводить - на работе не так удобно отписывать сюда И спорить тоже не нужно, лишь просто заинтересовался характеристикой "плохой стиль", и подумал, что, быть может, чего-то интересного не знаю, а если не знаю - стремлюсь узнать.

Что касается вопроса сопровождения - возможно да, иногда усложняет, не натыкался, но да
Цитата Сообщение от lemegeton Посмотреть сообщение
Естественно, земля вертится, количество вариантов бесконечно, так что бывают случаи, когда конструкторы с дефолтными значениями параметров оправданы.
т.е. все зависит от предметной области и требуемых ограничений на политику работы с классом, взять, хотя бы, мой пример с точками, где такой прием, не насаждаю, кажется мне коротким и удобным.

P.S. этот пост не имеет целью продолжить дискуссию на эту тему, думаю, мы пришли к консенсусу
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 21:54     Класс игральная карта
Еще ссылки по теме:

C++ Область видимости. один класс не видит другой класс
Подробно прокомментировать класс PolarCoordinates, представляющий собой класс координат точки на плоскости C++
C++ Иерархия: класс "карта", "колода карт"
C++ Создайте класс, в котором есть ostream& operator<<. Класс должен содержать очередь с приоритетом
Создать класс карта по условию C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
29.05.2013, 21:54     Класс игральная карта
  #20

Не по теме:

Цитата Сообщение от ITcrusader Посмотреть сообщение
дискуссию тож неохота разводить
Форум - не место для дискуссий?

Yandex
Объявления
29.05.2013, 21:54     Класс игральная карта
Ответ Создать тему
Опции темы

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