Рассмотрите решение .
то, Что Вы хотите, выражено в семантике C++, для помещения функции (для него функция) в пространстве имен.
нет никакого "статического класса" в C++. Самое близкое понятие было бы классом только со статическими методами. Например:
// header
class MyClass
{
public :
static void myMethod() ;
} ;
// source
void MyClass::myMethod()
{
// etc.
}
, Но необходимо помнить, что "статические классы" являются взломами в подобном Java виде языков (например, C#), которые неспособны иметь функции лица, не являющегося членом какой-либо организации, таким образом, они должны вместо этого переместить их в классах как статические методы.
В C++, что Вы действительно хотите, функция лица, не являющегося членом какой-либо организации, которую Вы объявите в пространстве имен:
// header
namespace MyNamespace
{
void myMethod() ;
}
// source
namespace MyNamespace
{
void myMethod()
{
// etc.
}
}
В C++, пространство имен более мощно, чем классы для "шаблона" статического метода Java, потому что:
Заключение: не Делайте скопировать/вставить что шаблон Java/C# в C++. В Java/C# шаблон обязателен. Но в C++, это - плохой стиль.
было аргументом в фаворе статическому методу, потому что иногда, нужно использовать статическую переменную члена парламента, не занимающего официального поста.
я не соглашаюсь несколько как шоу ниже:
// HPP
class Foo
{
public :
void barA() ;
private :
void barB() ;
static std::string myGlobal ;
} ;
Сначала, myGlobal называют myGlobal, потому что это - все еще глобальная частная переменная. Взгляд на источник CPP разъяснит что:
// CPP
std::string Foo::myGlobal ; // You MUST declare it in a CPP
void Foo::barA()
{
// I can access Foo::myGlobal
}
void Foo::barB()
{
// I can access Foo::myGlobal, too
}
void barC()
{
// I CAN'T access Foo::myGlobal !!!
}
На первый взгляд, факт бесплатная функция barC не может получить доступ к Foo:: myGlobal кажется хорошей вещью с точки зрения инкапсуляции... Это прохладно, потому что кто-то смотрящий на HPP не будет в состоянии (если, обращаясь к саботажу) для доступа к Foo:: myGlobal.
, Но если Вы смотрите на него тесно, Вы найдете, что это - колоссальная ошибка: Не только Ваша частная переменная должна все еще быть объявлена в HPP (и так, видимая ко всему миру, несмотря на то, чтобы быть частным), но необходимо объявить в том же HPP все (как ВСЕГО) функции, которые будут разрешены получить доступ к нему!!!
Так использование частного статического участника похоже на обход, снаружи в обнаженном виде со списком Ваших возлюбленных, татуированных на Вашей коже: Никто не разрешен затронуть, но все в состоянии посмотреть на. И премия: у Всех могут быть названия разрешенных играть с Вашими участниками.
private
действительно...:-D
Анонимные пространства имен будут иметь преимущество создания вещей, частных действительно частный.
Первый, заголовок HPP
// HPP
namespace Foo
{
void barA() ;
}
Только, чтобы быть уверенными Вы отметили: нет никакого бесполезного объявления зубца, ни myGlobal. Что означает, что никакое чтение заголовка не знает то, что скрыто позади barA.
Затем CPP:
// CPP
namespace Foo
{
namespace
{
std::string myGlobal ;
void Foo::barB()
{
// I can access Foo::myGlobal
}
}
void barA()
{
// I can access myGlobal, too
}
}
void barC()
{
// I STILL CAN'T access myGlobal !!!
}
, Как Вы видите, как так называемый "статический класс" объявление, fooA и fooB все еще в состоянии получить доступ к myGlobal. Но никто больше не может. И никто больше за пределами этой CPP не знает fooB, и myGlobal даже существуют!
В отличие от "статического класса", идущего на обнаженной фигуре с ее адресной книгой, татуированной на ее коже, "анонимное" пространство имен полностью одето , который кажется вполне лучше инкапсулировавшим AFAIK.
, Если пользователи Вашего кода не являются саботажниками (я позволю Вам как осуществление, находят, как можно получить доступ к половому органу общедоступного класса с помощью грязного неопределенного поведением взлома...), что private
, private
, даже если это видимо в private
раздел класса, объявленного в заголовке.
однако, если необходимо добавить другую "закрытую функцию" с доступом к члену парламента, не занимающему официального поста, все еще необходимо объявить его ко всему миру путем изменения заголовка, который является парадоксом, что касается меня: , Если я изменяю реализацию своего кода (часть CPP), тогда интерфейс (часть HPP) не должен изменяться. Заключение в кавычки Leonidas: " Это - ИНКАПСУЛЯЦИЯ! "
, Когда статические методы классов, на самом деле лучше, чем пространства имен с функциями лица, не являющегося членом какой-либо организации?
, Когда необходимо группироваться функции и канал что группа к шаблону:
namespace alpha
{
void foo() ;
void bar() ;
}
struct Beta
{
static void foo() ;
static void bar() ;
};
template
struct Gamma
{
void foobar()
{
T::foo() ;
T::bar() ;
}
};
Gamma ga ; // compilation error
Gamma gb ; // ok
gb.foobar() ; // ok !!!
, поскольку, если класс может быть шаблонным параметром, пространства имен не могут.
Создайте файл Outlook .ics
См. здесь для получения дополнительной информации. Пример находится в .NET, но он просто записывает вывод, поэтому его очень легко перевести в PHP.
<?php
//This is the most important coding.
header("Content-Type: text/Calendar");
header("Content-Disposition: inline; filename=filename.ics");
echo "BEGIN:VCALENDAR\n";
echo "PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN\n";
echo "VERSION:2.0\n";
echo "METHOD:PUBLISH\n";
echo "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\n";
echo "BEGIN:VEVENT\n";
echo "CLASS:PUBLIC\n";
echo "CREATED:20091109T101015Z\n";
echo "DESCRIPTION:How 2 Guru Event\\n\\n\\nEvent Page\\n\\nhttp://www.myhow2guru.com\n";
echo "DTEND:20091208T040000Z\n";
echo "DTSTAMP:20091109T093305Z\n";
echo "DTSTART:20091208T003000Z\n";
echo "LAST-MODIFIED:20091109T101015Z\n";
echo "LOCATION:Anywhere have internet\n";
echo "PRIORITY:5\n";
echo "SEQUENCE:0\n";
echo "SUMMARY;LANGUAGE=en-us:How2Guru Event\n";
echo "TRANSP:OPAQUE\n";
echo "UID:040000008200E00074C5B7101A82E008000000008062306C6261CA01000000000000000\n";
echo "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n";
echo "X-MICROSOFT-CDO-IMPORTANCE:1\n";
echo "X-MICROSOFT-DISALLOW-COUNTER:FALSE\n";
echo "X-MS-OLK-ALLOWEXTERNCHECK:TRUE\n";
echo "X-MS-OLK-AUTOFILLLOCATION:FALSE\n";
echo "X-MS-OLK-CONFTYPE:0\n";
//Here is to set the reminder for the event.
echo "BEGIN:VALARM\n";
echo "TRIGGER:-PT1440M\n";
echo "ACTION:DISPLAY\n";
echo "DESCRIPTION:Reminder\n";
echo "END:VALARM\n";
echo "END:VEVENT\n";
echo "END:VCALENDAR\n";
?>
На случай, если кому-нибудь понадобится это в PHP. Я искал вот это.