Ответить
03.04.2011, 23:43 #11
Ветеран
Avatar
Регистрация: 16.02.2011
Сообщений: 455
Карма: 21
Re: Инициализация массива строк в классе
const нельзя перезаписывать

А ведь получалось что в каждой функции они были локальными и друг о друге не знали
Реклама
04.04.2011, 01:20 #12
Ветеран
Avatar
Регистрация: 16.02.2011
Сообщений: 455
Карма: 21
Re: Инициализация массива строк в классе
#ifndef DECK_H
#define DECK_H

#include <iostream> // cin, cout
#include <clocale>  // поддержка русского языка
#include <conio.h>  // _getch()
#include <iomanip>
#include<ctime>
#include<stdlib.h>
#include<string>
using namespace std;

class DeckOfCards
{
private:
int deck[4][13];
string colour[4];
string face_value[13];
public:
DeckOfCards();
void shuffle();
void deal();
void change();
int two(int [],const int);
};

#endif


DeckOfCards::DeckOfCards()
{ int i=1;

for(int row=0; row<4; row++)
for(int column=0; column<13; column++)
    {
    deck[row][column]=i;
    i++;
    }
string colour1[]={"бубей", "червей", "пик", "крестей"};
for(int i=0; i<4; i++)
colour[i]=colour1[i];

string face_value1[]={"ДВОЙКА", "ТРОЙКА", "ЧЕТВЕРКА", "ПЯТЕРКА",
                "ШЕСТЕРКА", "СЕМЕРКА", "ВОСЬМЕРКА", "ДЕВЯТКА",
                            "ДЕСЯТКА","ВАЛЕТ", "ДАМА", "КОРОЛЬ", "ТУЗ"};
for(int i=0; i<13; i++)
face_value[i]=face_value1[i];
}


Вот такой получился конструктор, на большее ума не хватает, а ошибки вылезали из-за того, что не указал пространство имен перед объявлением класса( оно было указано после класса, и компьютер не понимал слово string)
04.04.2011, 01:56 #13
Ветеран
Avatar
Регистрация: 21.08.2010
Сообщений: 321
Карма: 19
Re: Инициализация массива строк в классе
Вот такой получился конструктор, на большее ума не хватает, а ошибки вылезали из-за того, что не указал пространство имен перед объявлением класса( оно было указано после класса, и компьютер не понимал слово string)


Кстати да, если пространство имен не указать, то будет ошибка. Вот сейчас писал ответ на по предыдущей теме в ветке "Объектно-ориентированное программирование". Там у меня было использование типа string. Интересное у вас задание, Алексей. По-моему, у меня где-то есть различные реализации программ на тематику тосования и сдачи карт. Как освобожусь попробую тоже написать эту программу. Потом сравним наши реализации)
05.04.2011, 03:03 #14
Ветеран
Avatar
Регистрация: 16.02.2011
Сообщений: 455
Карма: 21
Re: Инициализация массива строк в классе
Ну с инициализацией массива строк типа string я разобрался. А как инициализировать это:
 static const char *face[ 13 ] =

                { "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven"

                        "Eight", "Nine", "Ten", "Jack", "Queen", "King" };




Я имею ввиду если сначала объявить, а уж потом инициализировать:
static const char *face[ 13 ]; // это объявление
???????????????????????? // а как должна выглядеть инициализация
                    // пусть даже и не static const, а просто char *face[ 13 ];


И еще: что такое const это понятно, чтоб его не изменить, а зачем нам static?
05.04.2011, 03:23 #15
Ветеран
Avatar
Регистрация: 21.08.2010
Сообщений: 321
Карма: 19
Re: Инициализация массива строк в классе
И еще: что такое const это понятно, чтоб его не изменить, а зачем нам static?


const - ключевое слово, которое указывает, что мы объявляем константу (аналог Си-шного #define). Предписывает компилятору, что данная величина на протяжении всей программы не должна изменяться. Таким образом, еще на этапе компиляции можно избежать множества синтаксических, а главное - логических ошибок, когда мы меняем то, что не должно меняться. Значение константам нужно сразу задавать.

Одним словом, const создает переменную, которую нельзя изменить.

const int nVar = 5;
const char Ch = 'p';
double dbVar = 3.35;

nVar = (int)(dbVar * 0.05);

cout << "Enter symbol: ";
cin >> Ch;

dbVar += 1.25; 


В этом кусочке кода, строки

nVar = (int)(dbVar * 0.05);


и

cin >> Ch;


вызовут ошибки компиляции, т.к. переменные nVar и Сh нельзя изменять.
05.04.2011, 03:42 #16
Ветеран
Avatar
Регистрация: 21.08.2010
Сообщений: 321
Карма: 19
Re: Инициализация массива строк в классе
Вообще у const есть и иные возможности использования, но выше описал основную возможность использования.

К переменным в С++ могут применяться классы памяти, определяющие "время жизни" переменной. Классы памяти делятся на автоматические с локальным временем существования в памяти (auto и register) и на статические, с глобальным временем существования в памяти (extern и static).

По умолчанию для каждой переменной в С++ установлен класс памяти auto. Register, в принципе, используется достаточно редко, т.к. современные процессоры игнорируют его (они и сами знают, какую переменную лучше держать в своем регистре для ускорения скорости работы, а какую брать из оперативной памяти компьютера).

Переменные, объявленные как extern или static существуют на протяжении работы всей программы и разрушаются лишь после возврата (return) из главной функции программы (main, WinMain). По умолчанию всем глобальным переменным устанавливается класс памяти extern, поэтому, в принципе, его, как и auto для локальных, не имеет смысла лишний раз писать.

В отличие от extern, переменная с установленным классом памяти static, сохраняет свое значение на протяжении всей программы, в этом ее и особенность.
05.04.2011, 03:55 #17
Ветеран
Avatar
Регистрация: 16.02.2011
Сообщений: 455
Карма: 21
Re: Инициализация массива строк в классе
Спасибо, Антон. Как всегда все максимально подробно и доходчиво. А как Вы считаете, в данной программе имело смысл объявлять этот массив как static. То что он объявлен как const это логично, масти, понятно, меняться не должны, а какой нам здесь резон от static?
05.04.2011, 04:13 #18
Ветеран
Avatar
Регистрация: 21.08.2010
Сообщений: 321
Карма: 19
Re: Инициализация массива строк в классе
Алексей писал(а):
Спасибо, Антон. Как всегда все максимально подробно и доходчиво. А как Вы считаете, в данной программе имело смысл объявлять этот массив как static. То что он объявлен как const это логично, масти, понятно, меняться не должны, а какой нам здесь резон от static?


Если переменная не изменяется, то есть является константной, соответственно, и резона делать ее статической нет (она в любом случае будет на протяжении всего времени работы программы сохранять одно и то же значение)

К сожалению, саму программу еще не писал и в код не вникал, т.к. очень много работы в эти дни. Изредка успеваю заходить на сайт :)
05.04.2011, 04:19 #19
Ветеран
Avatar
Регистрация: 16.02.2011
Сообщений: 455
Карма: 21
Re: Инициализация массива строк в классе
Может это как-то в плане использования памяти компьютера экономичней?
Все таки Дейтелы какой-то смысл должны были вложить в такое объявление.
Ответить
Яндекс.Метрика