C ++ Доступ к закрытой структуре из другого класса - PullRequest
1 голос
/ 12 марта 2011

У меня есть класс, как показано ниже:

class B;
class A
{
   public:
       A();
      ~A();
      void createStuff(.......); //??

  private:
      B *b;
};

Объект B содержит еще один класс 'C', который имеет около 20 переменных-членов класса.

Я хочу пользователя классаA чтобы иметь возможность вызывать функцию createStuff (...) с набором аргументов, чтобы я мог построить объект C. Каков наилучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 12 марта 2011

Механизм, позволяющий классам предоставлять доступ своим личным членам, называется дружбой.

1 голос
/ 12 марта 2011

Переменная типа C принадлежит классу B;он обеспечивает доступ к данным в C. Класс B имеет конструкторы;вы будете использовать их для того, чтобы установить переменную класса B по порядку, и задача B - обеспечить правильное управление C.

Если вам нужен больший контроль над C, то у вас возникла проблема проектирования.Либо вашему классу A нужна собственная переменная класса C для управления, либо класс B не предоставляет необходимых вам инструментов и нуждается в исправлении, либо вы ошибаетесь, полагая, что вам нужен доступ и, следовательно, прямой контроль над содержимым переменнойкласса C.

Закон Деметры - руководство в таких сценариях;Вы, кажется, хотите нарушить это.

1 голос
/ 12 марта 2011

С тем, что вы опубликовали, похоже, что-то вроде этого может работать:

class B
class A:
{
   public:
       A();
      ~A();
      void ceateStuff(.......); //??

  private:
      B *b
}
void A::createStuff(argument1, argument2...)
{
    C = new C(argument1, argument2...) //You now have an instance of C with the arguments pass in to createStuff();

}

0 голосов
/ 12 марта 2011

В любом случае вы должны взглянуть на класс B, как он реализует инициализацию объекта C, можно ли им управлять (если нет - вы должны расширить интерфейс класса B и добавить эту функциональность)?

Если определение C доступно для A, возможно, вы можете использовать конструктор B таким образом:

void A::createStuff( const C& c)
{
    b = new B(c); 
}
...