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

Any instance access all instances (of a class)

本文关键字:实例 访问 任何 类的      更新时间:2023-10-16

这似乎是一个微不足道的问题,或者我可能误解了之前的信息/到目前为止我所做的研究。

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

在我的用法上下文中。我想有一个Button类,我可以简单地实例化多个Buttons,但调用一个函数可以调用引用所有按钮。

ButtonInstance.isMouseTargetting(cursorCoordinates);

这可能吗?如果是这样,它是否有效?

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

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

在我的用法上下文中。我想要一个Button类可以简单地实例化多个按钮,但调用一个函数可以吗调用引用所有按钮

您希望在按钮容器中执行此操作。按钮不是按钮容器,在GUI上下文中,您已经建立了层次结构。

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

是的。您可能已经为此创建了一个窗口/容器类

你的问题更多的是关于设计模式而不是c++本身。看看四人帮的书,你会找到一个合适的实现。

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

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;
}

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

注意默认构造函数(copy或move)。如果你没有显式地创建你的构造函数,那么你的一些按钮将不会进入列表,所以要么自己创建它们,要么删除它们。

Button( const Button& button ) = delete;

这是你要求的一种方法,但不一定是最好的解决方案。如果您自己将按钮添加到非静态容器中,然后从那里进行搜索,可能会更简单。

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

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