Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2011, 10:07   #1
milenium
Новичок
Джуниор
 
Регистрация: 06.05.2011
Сообщений: 3
По умолчанию Как правильно использовать класс в классе

Всем привет.
Не могу понять, как правильно реализовать использование объекта одного класса в другом классе.

Код:
class primer1{
private:
    int i;
public:
    primer1(int i) {this->i=i;};
    void set(int i) {this->i=i;};
    int get() {return i;};	
};


class primer2{
private:
    primer1 a;
    свои поля;
public:
    свои методы;	
};

int main(){
    primer2 b;
	Тут мне необходимо обратится к методу set класса primer1. Т.е. в объекте b(класс primer2) хочу изменить значение его поля a(класс primer1).
	Как это правильно сделать в соответсвии всем правилам ООП?
	
	Представляю себе это так. Для решения задачи мне надо получить доступ к полю primer1 a;
	Вариант1) Сделать в классе primer2 метод primer1& geta() {return a;};. Тогда будет в main типа b.geta().get(); b.geta().set(i);
	Вариант2) Вынести поле primer1 a; в public. Тогда всё и так понятно.
	Вариант3) Сделать в классе методы "дубли" типа int get() {return a.get();}; void set(int i) {a.set(i);};.
	
    return 0;
}
Подскажите как это правильно делается.
milenium вне форума Ответить с цитированием
Старый 06.05.2011, 11:14   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Вы не сможете к нему обратиться, т.к. переменная primer1 a объявлена с модификатором доступа private.
Можно сделать так:
Код:
class A
{
public:
  void Func();
...
};

class B
{
public:
  A a;
...
};

int main()
{
  B b;
  b.a.Func();
  ...
  return 0;
}
=================================== ==================================

А, извиняюсь, не дочитал вопрос.
Выбор из ваших трех вариантов зависит от конкретной задачи, от того, какие сущности представляют классы и вообще от общей структуры проекта. Так, в общем виде, трудно сказать. Но вообще, если вы помещаете объект в закрытый доступ, то и работать с ним должен только тот класс, в котором он объявлен, иначе он должен быть в открытом доступе
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария

Последний раз редактировалось Blade; 06.05.2011 в 11:25.
Blade вне форума Ответить с цитированием
Старый 06.05.2011, 12:57   #3
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

либо писать примерно так
Код:
class primer2{
private:
    primer1 a;
    свои поля;
public:
    void seti(int i) { a.set(i); }
};
либо использовать наследование. но тогда верноятно выйдет не совсем то что вы хотите... class primer2: public primer1 {...
тогда можно уже сделать так:
b.set(10);
onewho вне форума Ответить с цитированием
Старый 06.05.2011, 17:38   #4
milenium
Новичок
Джуниор
 
Регистрация: 06.05.2011
Сообщений: 3
По умолчанию

Приведу более конкретный пример, чтобы понять, что мне нужно.

Код:
class chelovek{
private:
	int rost;
	int ves;
	int vozrast;
public:
	chelovek(int rost, int ves, int vozrast) {this->rost=rost; this->ves=ves; this->vozrast=vozrast;};
	int getrost() {return rost;};
	int getves() {return ves;};
	int getvozrast() {return vozrast;};
	void setrost(int i) {rost=i;};
	void setves(int i) {ves=i;};
	void setvozrast(int i) {vozrast=i;};
};


class gruppa{
private:
	vector <chelovek> mas;
public:
	void add(chelovek c) {mas.push_back(c);};
	void del(int i) {mas.erase(mas.begin()+i);};

};


int main()
{
	gruppa d;
	d.add(chelovek(183,90,35));
	d.add(chelovek(165,65,20));
	//теперь у меня в массиве 2 человека с характеристиками.
	//Захотелось мне вдруг имзенить вес второго человека с 65 на 69.
	//Какие бы методы вы добавили в класс gruppa, чтобы это сделать?

	return 0;
}
milenium вне форума Ответить с цитированием
Старый 06.05.2011, 19:16   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

лучше бы в класс человек добавить поле имя( как уникальный id) - по нему можно удалять будет из вектора по имени (или изменять данные).. а пока пример по весу:
Код:
void gruppa::set_weight(old_w, new_w) {
for (int i=0; i<mas.size(); i++)
if (mas[i].getves()==old_w) mas[i].setves(new_w);
}
идея ясна?


upd:
вот тут ты юзаешь просто удаление по индексу "от балды"
Код:
	void del(int i) {mas.erase(mas.begin()+i);};
можешь также поступить и в set_weight()... например mas[i].setves(new_w);

и еще ; в конце каждой определенной функции - лишнее

Последний раз редактировалось onewho; 06.05.2011 в 19:21.
onewho вне форума Ответить с цитированием
Старый 06.05.2011, 20:45   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

milenium, ваш вариант вполне нормальный, я наверно так же сделал бы.
Только объекты весьма желательно передавать по константной ссылке:
Код:
void add(const chelovek& c) {mas.push_back(c);}
и, как уже отметили выше, если метод реализован прям в теле объявления класса, то точка с запятой после закрывающийся фигурной скобки не нужна
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 06.05.2011, 22:30   #7
milenium
Новичок
Джуниор
 
Регистрация: 06.05.2011
Сообщений: 3
По умолчанию

onewho,Blade спасибо за подсказки в синтаксисе.

onewho вы получается предлагаете делать "дубликаты" методов класса chelovek в классе gruppa. Но тогда выходит, что в классе chelovek 6 методов. Их дублируем в классе gruppa. Мне это кажется нерациональным.
Под дублированием я выше имел в виду типа
Код:
int gruppa::setrosti(int i,int a) {mas[i].setrost(a);}
А если в первом классе 100 методов. В классе2 использующем объект класса1 опять делаем эти 100 методов. Очень много трудозатрат впустую.
milenium вне форума Ответить с цитированием
Старый 07.05.2011, 10:55   #8
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

А я опять не дочитал ваш вопрос до конца... лучше не пишите его в комментариях, пишите после кода.

Как получить доступ к изменению свойств класса человек:
Код:
class gruppa{
private:
	vector <chelovek> mas;
public:
	void add(chelovek c) {mas.push_back(c);}
	void del(int i) {mas.erase(mas.begin()+i);}
        chelovek& Chelovek(unsigned int index)
        {
             // Добавить проверку на выход из диапазона
             return mas[index];
        }
};

        int main()
{
	gruppa d;
	d.add(chelovek(183,90,35));
	d.add(chelovek(165,65,20));
        d.Chelovek(1).setrost(150);

	return 0;
}
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
zlib->inflate как правильно использовать? Пепел Феникса Общие вопросы C/C++ 8 18.01.2011 20:26
Как правильно использовать MonthCalendar Shanuzina Компоненты Delphi 1 04.03.2010 11:58
как правильно использовать OR AND mpdasa Общие вопросы Delphi 2 19.01.2010 17:30
Как правильно использовать ComboBox Pirotexnik Общие вопросы Delphi 6 26.03.2009 23:30
Как правильно использовать переменные в процедурах nikolai_P Microsoft Office Excel 22 15.05.2008 13:15