oop — архитектура и дизайн программного обеспечения C ++

В моей программе на C ++ я хочу создать объект, который имеет такие свойства, как ширина, высота, площадь и т. Д. Я также хочу объявить методы, которые используют и обновляют эти свойства.

Я хочу, чтобы методы, которые «устанавливают» и «получают» правильную «ширину», перечислены как-то в заголовке, пространстве имен или дочернем классе (в любом случае это возможно) с именем WidthManipulator.

Причина, по которой я хочу создать свою структуру таким образом, заключается в том, что я хочу использовать имя «get» для другого метода другого класса, такого как HeightManipulator.

Но для вложенных классов я получаю ошибку «незаконный вызов нестатической функции-члена» для Rectangle :: WidthManipulator :: Get (). Я также не хочу создавать объекты Manipulator, так как эти классы не имеют свойств, только методы, которые используют и обновляют родительские свойства … Еще одна вещь, я хочу использовать void return по уважительной причине.

class Rectangle{
public:
int width,height;
int area;
int widthreturned;

class WidthManipulator{
public:
void Set(int x){width = x;}
void Get(){widthreturned = width};
};
};

Как я могу подойти к моей проблеме? Какой должна быть моя структура?

1

Решение

Не уверен, почему вы хотите структурировать свой манипулятор класса таким образом, но чтобы понять механизм класса Inner, учтите, что для доступа класса Inner к членам класса OUter внешний класс должен объявить Inner как друга:

class Outer
{
int area;
class Inner1;
friend class Outer::Inner1;
class Inner1
{
Outer* parent;
public:
Inner1(Outer* p) : parent(p) {}
void Set(int x){p->area= x;}

} inner1;
// ... more stuff
};

Если вы хотите проверить более подробно, я рекомендую вам взглянуть на пример шаблона проектирования Глава 11 Том 2 Мышление в C ++

3

Другие решения

Внутренний класс в C ++ не такой, как в Pascal. Он просто бледнеет в «пространстве имен» внешнего класса, но ничего другого не меняется. Он видит только своих собственных членов, и экземпляр не связан с внешним.

Если вам нужно отношение, вы должны как-то передать экземпляр внешнего, скажем, в конструкторе. Затем вы можете получить доступ к членам через этот указатель или ссылку.

5

По вопросам рекламы [email protected]