任何实例访问所有实例(类)

时间:2015-09-21 09:02:55

标签: c++ object instance

这可能看起来像是一个微不足道的问题,或者我可能误解了以前的信息/迄今为止我所做的研究。

但是有可能有一个带有函数的对象(在C ++中)可以访问它自己类型的所有实例吗?

在我的使用环境中。我希望有一个Button类,我可以简单地实例化多个Buttons但是调用一个函数可以调用引用所有按钮。

ButtonInstance.isMouseTargetting(cursorCoordinates);

这可能吗?如果是这样有效吗?

或者我应该让拥有Button实例的类调用每个实例来检查鼠标坐标是否匹配?

4 个答案:

答案 0 :(得分:1)

我的印象是你正在寻找有关如何设计这个的建议。

  

在我的使用环境中。我想要一个Button类,我就是这样   可以简单地实例化多个按钮,但可以调用函数   呼叫参考所有按钮。

您想在按钮容器中执行此操作。按钮不是按钮容器,在GUI上下文中,您已经有一个已建立的雇用层次结构。

  

或者我应该拥有拥有Button实例的类   用于检查鼠标坐标是否匹配的实例?

是。你可能已经有了一个窗口/容器类。

答案 1 :(得分:0)

您的问题更多是关于设计模式而不是C ++本身。看看Gang of Four的书;你会找到一个合适的实现。

答案 2 :(得分:0)

例如,您可以列出为给定类创建的所有对象

class Button {
public:
    Button() {
        _buttonList.push_back( this );
        // assign index/handler to this button
    }
    ~Button() {
        _buttonList.erase( _handle );
    }

    static bool isMouseTargeting( float x, float y ) {
        for ( auto button : _buttonList ) {
            // check if inside
        }
        return false;
    }

private:
    static std::list< Button* > _buttonList;
    // Handler _handle;
}

这只是您可以做的一个非常一般的例子。您可以使用除列表之外的任何其他容器(完全取决于您),并且您必须找到一种方法来索引每个按钮(或创建handle),以便稍后可以在析构函数中将其擦除。

注意默认构造函数(复制或移动)。如果您没有明确地创建构造函数,那么您的某些按钮将不会进入列表,因此要么自己创建,要么删除它们。

Button( const Button& button ) = delete;

这是一种做你要求的方法,但不一定是最好的解决方案。单独将按钮添加到非静态容器并从那里搜索可能更简单。

答案 3 :(得分:0)

简短的回答是肯定的。但我不建议将此功能放在Button类上,因为这会增加额外的(可能不是预期的)责任。您可以通过将Button对象存储在某个集合上来实现所需的行为,然后调用函数来检查鼠标所针对的按钮。

另一种解决方案是将按钮集合存储为代表用户界面的更高级别类的成员。这样你就可以调用这个类的方法,并检查鼠标光标当前是否在某个Button上。使用此设计,您可以轻松地为其他GUI元素(如果需要)添加相同的支持。