Я просто хотел резюмировать опции, упомянутые прежде, добавляя некоторые новые:
, Или Вы могли бы объединить эти опции:
Обеспечивают несколько перегруженных версий Вашего метода get, таким образом, вызывающая сторона может решить который способ пойти. В большинстве случаев только первый имеет реализацию алгоритма поиска, и другие просто переносят первый:
Object findObjectOrNull(String key);
Object findObjectOrThrow(String key) throws SomeException;
Object findObjectOrCreate(String key, SomeClass dataNeededToCreateNewObject);
Object findObjectOrDefault(String key, Object defaultReturnValue);
, Даже если Вы принимаете решение обеспечить только одну реализацию, Вы могли бы хотеть использовать соглашение о присвоении имен как этот для разъяснения контракта, и помогает, что Вы должны Вы когда-либо решать добавить другие реализации также.
Вы не должны злоупотреблять его, но это может быть полезно, espeacially при записи Класса помощника, который Вы будете использовать в сотнях различных приложений со многими различными соглашениями обработки ошибок.
Как мне перегрузить оператор << для my_struct ТОЛЬКО внутри класса?
Определите его как
static std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...
или
namespace {
std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...
}
в файле .cpp
в который вы реализуете MyClass
.
РЕДАКТИРОВАТЬ: Если вам действительно, действительно нужна область видимости класса и ничего больше, тогда определите ее как частную статическую функцию в указанном классе. Он будет в области видимости только этого класса и его подклассов. Он скроет все остальные пользовательские operator <<
, определенные для несвязанных классов (опять же, только внутри класса и его подклассов), если они не могут быть найдены с помощью ADL или не являются членами ] std :: ostream
уже.
Если под «только перегруженным в My_Class» вы имеете в виду только видимый / используемый моим классом, вы можете использовать перегрузку, не являющуюся членом, которая видна только My_Class. Например,
struct my_struct {
int a;
char c;
};
class My_Class
{
publiC:
My_Class();
}
Затем в My_Class.cpp:
namespace {
ostream& operator(ostream& os, const my_struct& mystruct ) {
os << mystruct.a << mystruct.c;
}
}
Не использовать оператор <<. Используйте именованную функцию-член и сделайте ее закрытой.
class My_Class
{
public:
My_Class();
private:
void Print( ostream & os, const my_struct & m );
};
Обратите внимание, что вы должны передавать структуру как константную ссылку, какой бы метод вы ни использовали.
Изменить: Нет необходимости делать оператор << членом класса, чтобы вы могли использовать его для печати члена класса. Вы можете сделать его другом структуры или полностью бесплатной функцией, которую затем использует класс.