任何实例访问所有实例(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 元素添加相同的支持(如果需要)。
这似乎是一个微不足道的问题,或者我可能误解了我迄今为止所做的 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 元素添加相同的支持(如果需要)。