При помощи
$_SERVER['REQUEST_METHOD']
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// The request is using the POST method
}
Для получения дополнительной информации см. документацию за $ _SERVER переменная.
Запрещены ли такого рода перекрестные включения?
Да.
Обходным решением было бы сказать, что член ifr в mainw является ссылкой или указателем, так что вместо полного объявления будет использоваться прямое объявление, например:
//#include "IFr.h" //not this
class IFr; //this instead
...
class mainw
{
public:
static IFr* ifr; //pointer; don't forget to initialize this in mainw.cpp!
static CSize=100;
...
}
В качестве альтернативы, определите Значение CSize в отдельном файле заголовка (чтобы Ifr.h мог включать этот другой файл заголовка вместо включения mainw.h).
У вас не может быть двух классов, которые таким образом встраивают друг друга. Вы можете сделать один из них указателем:
class foo;
class bar
{
foo* fooPtr;
}
Вам нужно будет построить foo, назначить его fooPtr в конструкторе bar и освободить его в деструкторе - это определенно немного больше работы.
Или, в этом случае , как предложил один из комментаторов, сделайте mainw :: size определением и поместите его в какое-нибудь общее место.
Такое циклическое включение не разрешено в C ++, но это должно работать:
Вместо включения IFr.h используйте прямое объявление.
class IFr;
class mainw
{
//...
};
Это сделает mainw
компилируется нормально, но весь код, который использует член ifr
, также должен включать IFr.h.
Это работает только потому, что ifr
является статическим
член. В противном случае компилятору потребуется знать точный размер ifr
.
Кроме того, как говорили многие другие люди, вы должны были включить защиту вокруг обоих заголовков, чтобы избежать ошибок, возникающих из-за включения одного и того же заголовка дважды.
#ifndef IFR_H
#define IFR_H
//...
#endif
Вы можете делать рекурсивные включения, как это, но в целом вам также нужно будет использовать какой-то трюк с защитой заголовков - иначе препроцессор перейдет в бесконечную рекурсию. На самом деле это не поможет вам решить основную проблему, потому что у вас, по сути, есть два класса, каждый из которых взаимно требует просмотра полного объявления другого для компиляции:
class mainw
{
public:
static IFr ifr; // needs to see the full declaration of the Ifr class in order to know the size
...
class IFr
{
public float[mainw::size]; // needs to see the full declaration of mainw in order to know what size is
Независимо от того, какой из них вы поставите первым, он будет быть не в состоянии скомпилировать, потому что ему нужно знать все детали другого.
Вы можете сделать:
// mainw.h
#include "IFr.h"
class mainw {
public:
static const size_t CSize=100;
static IFr<CSize> ifr;
...
};
// IFr.h
template <size_t Sz>
struct IFr {
float sz_[Sz];
};
Или, если CSize нужно изменить во время выполнения, используйте указатель, как показывает ответ @ChrisW.
Если ваш код обернут
#ifndef __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H
#define __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H
//... Code..
#endif
, тогда все будет в порядке :)
[EDIT] Написание кода: O: P