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

Any instance access all instances (of a class)

这似乎是一个微不足道的问题,或者我可能误解了我迄今为止所做的 information/the 研究。

但是是否有可能拥有一个对象(在 C++ 中)可以访问其自身类型的所有实例?

在我的使用范围内。我想要一个 Button class,借此我可以简单地实例化多个 Buttons 但调用函数可以调用引用所有按钮。

ButtonInstance.isMouseTargetting(cursorCoordinates);

这可能吗?如果是,效率高吗?

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

你的问题更多是关于设计模式而不是 C++ 本身。看看四人帮这本书;你会找到合适的实现方式。

例如,您可以列出为给定 class、

创建的所有对象
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;

这是完成您所要求的一种方法,但不一定是最佳解决方案。自己将按钮添加到非静态容器并从那里搜索可能更简单。

我的印象是您正在寻求有关如何设计它的建议。

In the context of my usage. I wanted to have a Button class, whereby I could simply instantiate multiple Buttons but call to a function could call reference all buttons.

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

Or should I have the class which owns the Button instances call each instance to check if the mouse coordinates match up?

是的。您可能已经为此准备了 window/container class。

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

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