Страница 1 из 1

Классы в С++. Нужна помощь в доработке.

Добавлено: 09 янв 2015, 19:27
vailetskin
Описать на языке СИ++ класс Cat, содержащий информацию об одном коте (кличка и год рождения). Переменные класса должны быть закрытыми (private). Строку необходимо хранить массивом char. Класс должен содержать:
- конструктор копирования;
- конструктор, заполняющий все поля объекта значениями, помещены в параметрах;
- методы для установки и получения значений полей объекта;
- метод заполнения полей класса при помощи printf и scanf;
- метод вывода информации о содержимом объекта на экран при помощи printf и scanf.

Начало вроде написала, а как дальше не знаю:

Код: Выделить всё

class Cat
{
    private:
      int god; // год рождения
      char kli4ka[32]; // кличка, ANSI
    public:
      Cat( int g, char *kli) { god=g; strncpy(kli4ka,kli,sizeof(kli4ka)); } // конструктор
      void Print(void) { printf("Год рождения котяры: %d, кличка особи: %s\n", god, kli4ka); } // вывод
      int GetGod(void) { return god; } // метод возвращения года
      int SetGod(int g) { god=g; return g>=0; } // 0-отрицательный год, 1-нормальный
};

Re: Классы в СИ++ Нужна помощь в доработке

Добавлено: 10 янв 2015, 00:12
Romeo
Не хватает конструктора копирования и отдельного метода для ввода данных.

Конструктор копирования - это специальный метод, который будет автоматически вызван компилятором для переноса данных одного объекта в другой во время копирования. Вот пример копирования:

Код: Выделить всё

class MyClass
{
public:
   int a1, a2;
};

...

MyClass object1;
object1a1 = 1;
object1a2 = 1;

MyClass object2 = object1;
На самом деле, даже в таком случае код уже будет работать, так как если конструктор копирования в классе не объявлен, то он автоматически генерируется компилятором, причём его сгенерированный вариант совершает так называемое поверхностное копирование, то есть вызывает конструкторы копирования для каждого поля объекта. Но часто бывает, что программисту не достаточно дефолтного конструктора копирования, в этом случае он может определить конструктор копирования сам. В нашем случае это будет выглядеть так:

Код: Выделить всё

MyClass(const MyClass& other)
{
   a1 = other.a1;
   a2 = other.a2;
}
(Более продвинутым программистам просьба не возбуждаться, я намеренно не использовал список инициализации, дабы не усложнять код и не погрязнуть в дебри рассуждений, в которые может завести желание рассказать сразу обо всём).

Со второй недоделанной частью задания, тоже ничего сложного нет. Чтение целого числа и строки делается так:

Код: Выделить всё

int a;
scanf("%d", &a);
char str[32];
scanf("%s", str);
Обрати внимание, что для обычного int мы должны использовать апмперсанд перед переменной (чтобы получить её адрес), а для строки не должны (так как переменная str, написанная без квадратных скобок, уже сама по себе является адресом).