1

在我的 C++ 程序中,我想创建一个具有宽度、高度、面积等属性的对象。我还想声明使用和更新这些属性的方法。

我想要在名为 WidthManipulator 的标头、命名空间或子类(无论如何都是可能的)中以某种方式列出的属性“宽度”的“设置”和“获取”方法。

我想以这种方式创建结构的原因是我想为另一个类的另一个方法使用“get”名称,例如 HeightManipulator。

但是对于嵌套类,我得到 Rectangle::WidthManipulator::Get() 的“非法调用非静态成员函数”错误。我也不想创建 Manipulator 对象,因为这些类没有属性,只是使用和更新父属性的方法......还有一件事,我想使用 void 返回是出于我自己的一个很好的理由。

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

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

我该如何解决我的问题?我的结构应该是什么?

4

2 回答 2

6

C++ 中的内部类与 Pascal 中的不同。它只是在外部类的“命名空间”中黯然失色,但没有其他任何改变。它只看到自己的成员,并且该实例与外部的无关。

如果你想要这个关系,你必须以某种方式传递一个外部实例,比如在构造函数中。然后您可以通过该指针或引用访问成员。

于 2013-06-25T21:32:21.847 回答
3

我不确定为什么要以这种方式构造类操纵器,但要了解 Inner 类的机制,请考虑对于 Inner 类访问 OUTer 类成员,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
};

如果您想查看更多详细信息,我建议您查看设计模式示例 Chapter 11 Vol 2 Thinking in C++

于 2013-06-25T21:57:52.163 回答