В моей программе на 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};
};
};
Как я могу подойти к моей проблеме? Какой должна быть моя структура?
Не уверен, почему вы хотите структурировать свой манипулятор класса таким образом, но чтобы понять механизм класса 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 ++
Внутренний класс в C ++ не такой, как в Pascal. Он просто бледнеет в «пространстве имен» внешнего класса, но ничего другого не меняется. Он видит только своих собственных членов, и экземпляр не связан с внешним.
Если вам нужно отношение, вы должны как-то передать экземпляр внешнего, скажем, в конструкторе. Затем вы можете получить доступ к членам через этот указатель или ссылку.