2015-09-21 3 views
0

Это может показаться тривиальным вопросом, или я, возможно, неправильно понял предыдущую информацию/исследование, которое я сделал до сих пор.Любой экземпляр доступа ко всем экземплярам (класса)

Но возможно ли иметь объект с функцией (в C++), которая может обращаться ко всем экземплярам своего собственного типа?

В контексте моего использования. Я хотел иметь класс Button, в котором я мог бы просто создать несколько экземпляров Buttons, но вызов функции может вызвать ссылку на все кнопки.

ButtonInstance.isMouseTargetting(cursorCoordinates); 

Возможно ли это? Если это так эффективно?

Или должен ли я принадлежать классу, которому принадлежат экземпляры Button, чтобы каждый раз проверить, совпадают ли координаты мыши?

+0

Вы можете запрограммировать все, что хотите. Например, конструктор может добавить новый экземпляр в коллекцию, и деструктор может удалить его. Затем вы можете получить доступ к коллекции, как хотите. –

+0

Для этого не существует языковой поддержки, но пока вы держите все свои кнопки в одном и том же месте, вы можете просто перебирать их и вызывать функцию isMouseTargetting во всех по одному. – Melkon

+0

Так что, если бы у меня был защищенный контейнер, могли бы все экземпляры 'Button' его получить? –

ответ

1

У меня создается впечатление, что вы ищете советы о том, как это сделать.

В контексте моего использования. Я хотел иметь класс Button, в результате чего я мог бы создать несколько кнопок, но вызов функции мог ссылаться на все кнопки.

Вы хотите сделать это в контейнере с кнопками. Кнопка не является контейнером с кнопками, и в контексте графического интерфейса у вас уже есть установленная иерархия.

Или должен ли я иметь класс, которому принадлежат экземпляры Button, каждый экземпляр , чтобы проверить, совпадают ли координаты мыши?

Да. У вас, вероятно, уже есть класс window/container для этого.

0

Ваш вопрос скорее о шаблоне проектирования, чем сам C++. Взгляните на книгу «Банда четырех», вы найдете соответствующую реализацию.

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; 

Это один из способов сделать то, что вы просили, но не обязательно лучшее решение. Может быть проще просто добавить кнопки в нестатический контейнер самостоятельно и искать оттуда.

+0

Итак, статическая переменная будет ссылаться на одно и то же место в памяти в любом экземпляре класса? –

+0

@OliverGiess Правильно. Он будет работать как глобальная переменная. Если он был общедоступным, вы могли бы получить к нему доступ (одно и то же место памяти) вне класса. Просто не забудьте обе объявить его в файле заголовка и определить его в исходном файле. – aslg

0

Короткий ответ: да. Но я не буду рекомендовать использовать эту функциональность в классе Button, так как это добавит дополнительную (возможно, не ожидаемую) ответственность за нее. Вы можете добиться желаемого поведения, сохранив объекты Button в какой-либо коллекции, а затем вызовите функцию, чтобы проверить, какая кнопка предназначена для мыши.

Другим решением было бы сохранить коллекцию кнопок в качестве члена класса более высокого уровня, который представляет ваш пользовательский интерфейс. Таким способом вы можете вызвать метод этого класса и проверить, находится ли курсор мыши на какой-либо кнопке или нет. С помощью этого дизайна вы можете легко добавить ту же поддержку для других элементов GUI (если вам нужно).

Смежные вопросы