Круговой заголовок C++ включает

При помощи

$_SERVER['REQUEST_METHOD']

Пример

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
     // The request is using the POST method
}

Для получения дополнительной информации см. документацию за $ _SERVER переменная.

14
задан Dukeling 16 September 2013 в 18:42
поделиться

6 ответов

Запрещены ли такого рода перекрестные включения?

Да.

Обходным решением было бы сказать, что член 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).

16
ответ дан 1 December 2019 в 12:27
поделиться

У вас не может быть двух классов, которые таким образом встраивают друг друга. Вы можете сделать один из них указателем:

class foo;

class bar 
{
    foo* fooPtr;
}

Вам нужно будет построить foo, назначить его fooPtr в конструкторе bar и освободить его в деструкторе - это определенно немного больше работы.

Или, в этом случае , как предложил один из комментаторов, сделайте mainw :: size определением и поместите его в какое-нибудь общее место.

4
ответ дан 1 December 2019 в 12:27
поделиться

Такое циклическое включение не разрешено в C ++, но это должно работать:

Вместо включения IFr.h используйте прямое объявление.

class IFr;
class mainw
{
    //...
};

Это сделает mainw компилируется нормально, но весь код, который использует член ifr , также должен включать IFr.h.

Это работает только потому, что ifr является статическим член. В противном случае компилятору потребуется знать точный размер ifr .

Кроме того, как говорили многие другие люди, вы должны были включить защиту вокруг обоих заголовков, чтобы избежать ошибок, возникающих из-за включения одного и того же заголовка дважды.

#ifndef IFR_H
#define IFR_H
//...
#endif
1
ответ дан 1 December 2019 в 12:27
поделиться

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

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

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

1
ответ дан 1 December 2019 в 12:27
поделиться

Вы можете сделать:

// 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.

1
ответ дан 1 December 2019 в 12:27
поделиться

Если ваш код обернут

#ifndef __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H
#define __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H
//... Code..
#endif

, тогда все будет в порядке :)

[EDIT] Написание кода: O: P

0
ответ дан 1 December 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: