Просмотр одиночного сообщения
Old 10-02-2006, 10:34   #34
Alvarez
Registered User
 
Аватар для Alvarez
 
Сообщений: 120
Проживание: Хельсинки
Регистрация: 08-08-2005
Status: Offline
Репутация: 0
Talking

Цитата:
Сообщение от zuber
Усе, финал версион

#include <string>
#include <iostream>

using namespace std;



class Sobak{
private:
string nimi;
string rotu;
string vuosi;
public:
// konstructor
Sobak();
// kostruktor so znachenijami (esli nado)
Sobak(string /*name*/, string /*breed*/, string /*year*/);
// destruktor
~Sobak();

void setName(string name);
string getName(void);
void setBreed(string name);
string getBreed(void);

void setYear(string name);
string getYear(void);

Sobak &operator=( Sobak & );

// debug
void printMe(void);
private:
string cutString(string);
};

Sobak::Sobak(){
// nothing
nimi = "";
rotu = "";
vuosi = "";
}


Sobak::~Sobak(){
// nothing
}

Sobak::Sobak(string name, string breed, string year){
this->setName(name);
this->setBreed(breed);
this->setYear(year);
}


(c) Zuber


Здравствуйте.
Позволю себе слегка покритиковать Ваше решение - не ради принижения Ваших програмистских способностей, а только лишь ради нахождения лучшего решения.
Возможно, моё решение слегка и не вписывается в требуюмую функцинальность.

1. Собака рождается обычно известной породы => порода должна быть в конструкторе.
2. Порода собаки не может изменяться => SetBreed - позволяет это (вивисекция?)
3. Год рождения собаки тоже не может изменяться => должен передаваться конструктору. Единственная здесь устанавливомое поле - кличка собаки (может, всё таки имя - можно её сменить в зависимости от настроения хозяина когда годно.
Конструктор по умолчанию у Вас странный. Уж если он Вам так необходим - присваивайте значения в списке инициализации - это гораздо эффективнее. Та же беда с конструктором и другим...
Итак, на мой взгляд конструктор должен быть один, принимающий значения породы и года. Кличку хозяин даст позже. Конструктор же по умолчанию, если и нужен, то должен быть private, что означает его использование лишь инициализаторами С++, а не клиентами класса.
4. По правилам хорошего тона все get методы должны возвращать только константы. Хотя, в Вашем случае это не ссылки и не указатели - и так покатит (но подумайте о стиле, всё же)
5. Породу я бы сделал указателем на класс породы, а не её именем, потому как порода - это набор свойств, которые удачно инкапсулируются соответствующим классом, а не только название. Представьте что кому то захотелось узнать поподробнее про собачонку. Узнал породу, и что , лезем в интернет за инфой? А у нас бы тут уже и ссылочка имелась на всю инфу, все линки... - и не надо усложнять жизнь поиском, и памяти меньше потратим.
6. Деструктор всегда должен быть витруальным - опять таки по правилам хорошего тона - Вы породите подкласс Цирковой собаки, поведёте её на выставку Собак, и не сможете затем с этой Выставки уничтожить её Цирковые достоинства....
7. Вы действительно считаете, что Собака должна уметь резать строки? Мне кажется, Собака создавалась чтобы бегать, прыгать, размножаться, ногу поднимать... Резать строки должен РезательСтрок - совсем другой объект, класс если хотите, причём сейчас он это делает так, а завтра будет делать ещё эффективнее - и Собака ничего про это не должна знать. Резать он будет их не только Собаке, а ещё и Кошкам, Белкам, и Зайчикам. Выход - убрать нафик cutString из Собаки, а все значения на входе передавать инварианту - методу, который проверяет (validate) состояние объекта Собака, или параметов для Собаки, и если надо, то и правит их по своим правилам => может и подрезать строки, пользуясь переданной ему ссылкой на РезателяСтрок... Этот злобный валидатор Собак может быть совершенно другим классом, например другом (friend) Собак... Не скрещивайте Собак с бездушным РезателемСтрок

Вои моё мнение. хотите, принимайте - хотите нет. Может задание и ставит целью научить писать set/get, но писать грамотно нужно стараться всегда.

Не принимайте всерьёз мою критику, Зубер, я просто развлекаюсь

Удачи.
 
0
 
0
    Ответить с цитированием