2015-12-14 3 views
0

Говорят, что в файле foo.h у меня есть:Определить перечисление в классе или в файле?

enum bar { 
    ONE = 1, 
    TWO 
}; 

class foo { 
    bar m_bar; 
public: 
    void setBar(bar arg){ m_bar = arg; } 
    bar getBar() const { return m_bar; } 
}; 

В моем текущем проекте, единственным стойким bar переменная будет m_bar. Но у меня будут другие функции, кроме foo, которые содержат bar, например, GUI-класс, который создает локальный bar и передает его setBar.

Итак, вот мой вопрос, есть ли какое-либо обоснование для определения bar публично внутри foo против только внутри класса, где он находится?

+1

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

+0

@BeyelerStudios Итак, вы говорите об обертке foo.h в пространстве имен, которое инкапсулирует как 'enum', так и 'class', но оставить' enum' из 'класса'? –

+0

вы можете применить те же соображения к вашему классу 'foo' - если это соответствует вашему дизайну - если вы предпочитаете использовать общую номенклатуру (например,' Sample') для своих классов, возможно, пространство имён было бы также подходящим ... – BeyelerStudios

ответ

2

Итак, вот мой вопрос, есть ли какое-либо обоснование для определения бара внутри foo по сравнению с только внутри класса, где он есть?

Если все функции, которые создают/работу с баром связаны с Foo функциональности, то это вполне приемлемо, чтобы написать это:

class foo 
{ 
    enum bar { 
     ONE = 1, 
     TWO 
    }; 
}; 

void process_bar_of_foo(foo::bar bar_value); // process the bar of a foo 

Если с другой стороны, вы можете написать код, который (концептуально) не имеет ничего общего с экземпляром foo, но имеет дело со значениями бара, вы, вероятно, должны писать его отдельно.

+0

Так что, как в примере, я буду локально определять «бар» для чтения значения из графического интерфейса в «foo», тогда я должен определить 'bar' внутренне для' foo'? –

+0

Да, я так думаю (по крайней мере, так я это делаю в своих проектах). – utnapistim

0

Ну, как бы то ни было, вы можете создавать объекты с объектами и функциями вне класса foo, как вы упомянули, а затем передать его любому объекту foo, который вы делаете.

Если бы вы определили его в классе, то вы бы не смогли создать объекты-бар, если вы сначала не создадите класс foo, что может привести к ненужным накладным расходам, если вы просто хотите перечислить объект.

И это действительно зависит от того, что вы собираетесь делать. Если вы планируете использовать панель с классом foo, тогда было бы вполне приемлемо определить ее там. В противном случае, если он будет доступен в другом месте, оставьте его как есть.

+0

Я имел в виду определить его внутренне, но публично. Я уточню вопрос. –

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