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

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

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

Иерархия геометрических объектов: клас точка->класс квадрат->класс прямоугольник C++
C++ описать класс карта
C++ Класс домов и класс улиц для учета поступлений квартплаты. Массив
Класс, производный класс, паблик-класс C++
C++ Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки машин ”: марка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 08:43     Класс игральная карта #2
Цитата Сообщение от Karata Посмотреть сообщение
с переменными флоат если это возможно
А что в игральной карте может описываться вещественной переменной? Толщина материала, из которого она сделана?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 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
:)
Эксперт С++
4378 / 3221 / 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
:)
Эксперт С++
4378 / 3221 / 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
 Аватар для lemegeton
2910 / 1339 / 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 16:17     Класс игральная карта #10
Цитата Сообщение от lemegeton Посмотреть сообщение
Можно, но плохой стиль.
Не могли бы поконкретнее?
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
29.05.2013, 16:33     Класс игральная карта #11
Не сказал бы что Tulosba тут придерживается плохого стиля (если говорить общо), но в данном контексте - да, неудачный вариант. Но и предложенный by lemegeton c конструктором без аргументов - тоже неудачный. Если мы работаем с такой предметной областью, то трудно себе представить карту с:

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

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

А чтобы еще краше было, завести для них enum'ы для более жесткого контроля типов.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.05.2013, 16:43     Класс игральная карта #12
ITcrusader, я согласен с тем, что конструктор без параметров в данном случае довольно странная затея. Но если уж он есть (и считать, что он нужен и полезен), и есть конструктор с параметрами (который тоже нужен и полезен), то почему бы не объединить их в один с параметрами по умолчанию. Вот это для меня не понятно, и именно это я просил прояснить.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
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
 Аватар для lemegeton
2910 / 1339 / 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++
 Аватар для ITcrusader
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
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
29.05.2013, 17:33     Класс игральная карта #17
Цитата Сообщение от ITcrusader Посмотреть сообщение
названо плохим стилем (тоже дает возможность создания массивов, векторов, как описано выше).
Плохим стилем является объявление значений по-умолчанию для конструктора. Долго и нудно разглагольствовать, может быть позже у меня будет демагогическое настроение. В двух словах -- усложняет поддержку кода.

Добавлено через 3 минуты
Естественно, земля вертится, количество вариантов бесконечно, так что бывают случаи, когда конструкторы с дефолтными значениями параметров оправданы. Да и вообще, опыт появляется от прыганья по граблям. Так что никакой демагогии не дождетесь -- пишите, как считаете нужным.
Tulosba
:)
Эксперт С++
4378 / 3221 / 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++
 Аватар для ITcrusader
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++ Иерархия: класс "карта", "колода карт"
Реализовать класс Goods используя для представления цены класс Money C++
Отдельно класс данных, класс формул и главный класс C++

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

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

Не по теме:

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

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

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