dostemp metodą jednej klasy do privatnych innych klas

0

mam jedną pytanie , nie mogę stworzyć takiej techniki ,aby móc ..... [???] od razu podam co chcę robić będzie jasnej . mam 4 klasy,TV, DVD, radio i pilot. klasy TV DVD i radio mają swoje metody i działania,główniej chodzi mi o to że wszystkie te klasy mają privatach int głos,i int kanal.a ich metody publiczne mogą tylko zmieniać głos i kanał tylko po 1ym poziome . tak jak przy użyciu void zmien_kanal {++kanal;} a pilot może zmienić np od razu z 5-ego do 9 ego kanału. pytanie w tym, jak mam metodę kombinować , żeby gdy wołam w pilocie zmien_glos() (albo zmien_kana()) ono widziało z klas wyżej wymienionych którego onoff jest true, i zmienił tego głos ?. czy powinienem dla każdego deklarować osobno,np tak void pilot::DVD::zmien_glos() i dla radia void pilot:📻:zmienglos();? chyba raczej nie.trzeba użyć jakiegoś szablonu albo nie wiem jakoś pilot::T::zmien_glos() ,a ten T oznaczy
<klasa z="z" onoffem="onoffem" true="true">. proszę o pomoc.

#include<iostream>

using namespace std;

class pilot;


class  TV
{
     private: 
          bool onoff;    
          int kanal;
          int glos;
          
     public:
          friend class pilot;  
          TV(){onoff=true,kanal=0,glos=10;}
          TV(bool ){onoff=false,kanal,glos;}
          ~TV(){}  
          void zmien_glos(){++glos;}
          void zmien_kanal(){++kanal;}
          void pokaz();
          
};
 


class DVD
{
      private:
          bool onoff;
          bool play;
          int piosenka;
          int glos;
      public:  
          friend class pilot;       
          DVD(){onoff=true,play=true,piosenka=0,glos=0;}
          DVD(bool){onoff=false,play=false,piosenka,glos;}
          ~DVD(){};
          void Play();
          void zmien_glos(){++glos;}
          void zmien_pios(int je){piosenka+=je;}
          void pokaz();
};
  

class radio
{
      private:
          bool onoff;    
          double kanal;
          int glos;
      public:
          friend class pilot;       
          radio(){onoff=true,kanal,glos;}
          radio(bool ){onoff=false,kanal,glos;}
          ~radio(){}  
          void zmien_glos(){++glos;}
};
            
class pilot
{
       private: 
            class TV;class DVD;class radio;      
            int przyciski;// te od 0 do 9
            int glosowe;// ten od  volume + -
            
       public:
              
            
};

Dziękuję.

0

Niech klasa DVD, Tv ... deklaruja przyjazn (friend) z klasa Pilot

0

no jest deklarowana , tylko nie wiem jakiej techniki zrobić . jakby była jedna klasa pilot i jedna z tamtych trzech to wiem jak, ale z trzema nie umiem.

0

napisz friend trzy razy, po jednym dla kazdej docelowej..

0

aha. a co z tym pilot::zmien_glos() zrobić żeby przycisnąć to ono zmienił głos tej klasy którego onoff jest true. właśnie jak go zadeklarować mam?

void pilot::zmien_glos() 
{
     if(DVD::onoff==true)
     ..........
     if(radio::onoff==true)
     ..........
     if(TV::onoff==true)
     .........
    else   cout<<" niema pradu ",
}

tak? czy jakoś inaczej byłby bardziej po ludzku?

0

bo ja myślałem z tym inaczej zrobić,

void pilot::zmien_glos(class x,int a)
{
glos+=a;
}

i żeby ono inaczej jakoś ten x porównał w privatach w classach i zastąpił z tą klasą który jest onoff true, czyli
działał z tym urządzeniem który jest włączony, (a te wł / wył to inaczej już ma być).

0

w tym if, masz zle, tak mozna tylko zmienne statyczne deklarowac, porponuje dodac accesory, czyli metody get i set aby pobrac i ustawic wartosci zmiennych...
wtedy poprzez accesor bedziesz miec dostep do prywatnego pola, a metoda set nie zmieni wartosci jesli bedzie ona niewlasciwa (np zmiennej int parzysta przypisze zmienna nieparzysta :) ), dzieki temu bedzie jeszcze bardziej przejrzysty dostep, a jesli wszedzie robisz na zywca friend, to zmien klasy na struktury, bo wtedy to tak bedzie wygladalo...
bo poco ograniczenia dostepu jesli wszedzie jest friend?

0

po co umieściłeś to w private pilota? To nic nie robi (forward declaration niepotrzebne jest, bo wszystkie klasy są już opisane powyżej pilota)

class TV;class DVD;class radio;

no i teraz do rzeczy. Masz 10 telewizorów, 2 radia i 3 DVD. Którymi zarządza twój pilot? Musisz to sobie gdzieś w pilocie zapisać, z kim on w ogóle gada.

 if(DVD::onoff==true)
     ..........
     if(radio::onoff==true)
     ..........
     if(TV::onoff==true)

coś takiego nie przejdzie, bo onoff nie jest statyczne. Inaczej: nie wiadomo, o który telewizor/radio/dvd się pytasz tymi if'ami.

  1. więc możesz np stworzyć w pilocie listę wskaźników do telewizorów, video itd, do których coś będziesz wysyłać (i ręcznie podpinać do pilota urządzenia).
class Pilot {
   // ...
   public:
   vector<radio*> radia;
   // ...
   };

void pilot::zmien_glos()
{
for(int i=0; i<radia.size(); i++) if(radia->onoff==true)
     radia[i]->glos = ...
}

ale to nie jest realne. IMHO powinieneś dać jeszcze jedną klasę (powiedzmy pokój - w niej będą informacje o znajdujących się urządzeniach (tam są tablie ze wskaźnikami). jest również informacja o pilocie/pilotach (wskaźnik /tablica wskaźników do pilot).

0

Marcin: cytat:w tym if, masz zle, tak mozna tylko zmienne statyczne deklarowac...bo poco ograniczenia dostepu jesli wszedzie jest friend?

to tak żeby jasnej było o co mi chodzi,to bym jeszcze kombinował,(np: bool Onoff(){return onoff;} ),chyba tak można..i to jest kawałek kodu, części najważniejsze związane z moim pytaniem.accesory jeszcze nie znam będę musiał się uczyć. :-/

Ranidez , mam 1 telewizor 1 dvd i 1 radio, a na pilocie będzie przycisk np: przelacz(), który mam zamiar tak zrobić że pykam na DVD, w DVD onoff staje się true a te drugie false, i tak dla wszystkich, tylko ne zdążyłem tego dodać bo stanąłem na tytm, a jeśli bym miał 100 TV-ów ,bez class DVD i radio,to już jest sprawa jak nóż po maśle.bo wtedy jest całkiem sprawa inaczej, mam 2 klasy pilot i TV , a to że TV Są różne to już nie problem.
TV sharp;
TV sony; itd

void pilot::zmien_glos(class TV & t ,int a)
{
t.glos+=a;
}
// i w main

pilot pil;

pil.zmien_glos(sony,4);
pil.zmien_glos(sharp,8);.. itd...

i jest załatwiona dla wszystkich TV. chodzi mi raczej o co innego.chyba za wcześno się o taki coś brałem, jednak się nauczę accesory.może w tedy coś wyjdzie. [glowa]

0

Dzięki za wczorajsze zdanie, ale jakoś ja coś takiego kombinowałem , jak sądzą starsze ode mnie programiści, to jest poprawnie czy nie bardzo zadziała ??

class pilot
{
            
       
       public: 
            pilot(){}  
            ~pilot(){}
            pilot(bool,bool,bool);
            void przelacz(TV & t,DVD & d,radio & r){pilot(t.onoff,
                                         d.onoff,r.onoff);}
            void zmien_glos(int);                             
};

void pilot::zmien_glos(int a)
{
    TV  t; DVD  d; radio  r;
    if(t.onoff=true)
       t.glos+=a;
    if(d.onoff=true)
       d.glos+=a;
    if(r.onoff=true)
       r.glos+=a;
       }        

kompiluje się i w miarę robi swoje wymagania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1