2013-05-29 3 views
0

У меня проблема с C++, но я не знаю, как это решить.Отключение развязки вложенных классов C++

У меня есть два класса, A и B, которые в любом случае не наследуются. A - класс Client, а B - класс, в котором хранится список Client (класс A).

Я хочу только B, чтобы создать экземпляр и уничтожить класс B, но я хочу, другие части моего кода, чтобы иметь возможность вызывать методы в рамках класса А.

Изначально у меня было следующее:

class B { 
public: 
    class A { 
     public: 
      void setX(int val); 
      int getX(); 
     private: 
      int x; 
      A(); 
      ~A(); 
    }; 

    B() 
    ~B() 
    .... 
}; 

Это позволяет мне называть конструктор/деструктор A из B и делает его конструктором/деструктором частным от остальных, но вызов setX() и getX() на A стал хлопотным, поскольку мне нужно вызвать B :: A.

Я думал, что положить A в свой собственный файл (это собственный класс, а не вложенный), поскольку другие классы могут вызывать методы на A. Но теперь B не может получить конструктор/деструктор A, поскольку он является приватным. Если я сделаю это общедоступным, тогда любой может создать объект класса A.

Я не уверен, что это лучший способ сделать это. Если A - это собственный класс, как я могу сохранить конструктор/деструктор, доступный только для B, пожалуйста, в то время как другие классы могут вызвать setX() и getX() для объекта из A, пожалуйста?

ответ

2

Объявление A в своем собственном, не вложенном классе, но с классом друзей B должно делать трюк.

Friend classes

Оставляя вам:

class B{ 
public: 
    B() 
    ~B() 
    .... 
}; 

и

class A { 
    friend class B; 
    public: 
     void setX(int val); 
     int getX(); 
    private: 
     int x; 
     A(); 
     ~A(); 
}; 
+0

Спасибо, это работает как шарм! Теперь я знаю об использовании ключевого слова «friend», спасибо большое! – user1777907

0

Я думаю, вы могли бы перепутались (Или я, читая ваш пример: P).

Объявление вложенного класса позволяет вложенному классу получить доступ ко всем членам ne класс, а не обратный, как я понял из вашего объяснения.
Я имею в виду: B внутри A означает, что A-доступ является членом B, а не обратным!
Nested Classes Question(Check second response, not first!)

Если, говоря в вашем вопросе: «Я хочу только B, чтобы создать экземпляр и уничтожить класс B» вы имеете в виду: «Я хочу только B, чтобы создать экземпляр и уничтожить класс А», то у вас есть два варианта.

Вы можете либо сделать B вложенной класс A, что позволяет получить доступ к B Al личные вещи из A или используйте друг классы. (Проверьте ответ @Egg)

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