2016-05-02 3 views
0

Я пытаюсь обновить значение числа, чтобы сделать его 30, путем доступа к 3 различным функциям (они имеют одинаковое имя) из 3 разных классов. Не могли бы вы мне помочь ? Я должен использовать функции в классе D. Я пробовал с созданием 3-х различных объектов и применения к каждой из них функции, но она не работаетДоступ к функциям различных классов

using namespace std; 

int callA=0; 
int callB=0; 
int callC=0; 
class A 
{ 
protected: 
    void func(int & a) 
    { 
     a=a*2; 
     callA++; 
    } 
}; 

class B 
{ 
protected: 
    void func(int & a) 
    { 
     a=a*3; 
     callB++; 
    } 
}; 

class C 
{ 
protected: 
    void func(int & a) 
    { 
     a=a*5; 
     callC++; 
    } 
}; 

class D 
{ 
    int val; 
    public: 
     //Initially val is 1 
     D() 
     { 
      val=1; 
     } 

     //Implement this function 
     void update_val(int new_val) 
     { 

      A a; 
      B b; 
      C c; 
      c.func(b); 
      b.func(a); 


    } 
}; 
+0

Что вы пытаетесь достичь? – perencia

+0

Мне нужно получить доступ к функции 3 раза, сначала от A, затем от B, а затем от C, чтобы сделать new_value = 30. – Mihaela

+0

Итак, 1 * 2, от функции A; затем 2 * 3 из B, а затем 6 * 5, из C – Mihaela

ответ

1

Вы не можете получить доступ из класса D в func метод классов A, B, C, потому что они защищены.

Для доступа к защищенному методу класса ваш класс должен быть другом или производным классом. В противном случае вам необходимо установить их видимость для публики.

Для далее here

Использование производного класса, это должно работать;

using namespace std; 

int callA=0; 
int callB=0; 
int callC=0; 
class A 
{ 
protected: 
    void func(int & a) 
    { 
     a=a*2; 
     callA++; 
    } 
}; 

class B 
{ 
protected: 
    void func(int & a) 
    { 
     a=a*3; 
     callB++; 
    } 
}; 

class C 
{ 
protected: 
    void func(int & a) 
    { 
     a=a*5; 
     callC++; 
    } 
}; 

class D : public A, public B, public C 
{ 
    int val; 
    public: 
     //Initially val is 1 
     D() 
     { 
      val=1; 
     } 

     //Implement this function 
     void update_val(int new_val) 
     { 
      // if new_val is '1' 
      //now you can call func methods; 
      A::func(new_val); 
      B::func(new_val); 
      C::func(new_val); 
      // then if you print new_val it is '30' 
      // c.func(b); // You can't pass b. b isn't an integer 
      // b.func(a); // idem 


    } 
}; 

// ..... //

int main(){ 
    D d; 
    d.update_val(1); 
} 
+0

@MichaelWalz Я ответил 40 минут назад. В моем ответе есть ссылка на то, как получить класс. Или использовать класс друзей. Поэтому мой ответ охватывает все возможные ответы. – granmirupa

+0

@MichaelWalz, однако теперь я обновляю его, используя множественное наследование – granmirupa

+0

ОК, теперь это возможное решение странной проблемы. –

0
#include<iostream> 
using namespace std; 

int callA=0; 
int callB=0; 
int callC=0; 
class A 
{ 
public: 
    void func(int & a) 
    { 
     a=a*2; 
     callA++; 
    } 
}; 

class B 
{ 
public: 
    void func(int & a) 
    { 
     a=a*3; 
     callB++; 
    } 
}; 

class C 
{ 
public: 
    void func(int & a) 
    { 
     a=a*5; 
     callC++; 
    } 
}; 

class D 
{ 

    public: 
     int val; 
     //Initially val is 1 
     D() 
     { 
      val=1; 
     } 

     //Implement this function 
     void update_val() 
     { 

      A a; 
      B b; 
      C c; 
      a.func(val); 
      b.func(val); 
      c.func(val); 


    } 
}; 

int main() 
{ 
    D d; 
    d.update_val(); 
    std::cout<<d.val<<std::endl; 

    return 0; 
} 
+0

Не соответствует требованиям OP: см. Его комментарий: _ Мне нужно только написать функцию обновления, так что да, эти функции должны быть защищены. –

Смежные вопросы