Заголовочные файлы C++ - Запутанный!

Вы можете сделать это в базе, используя код

# Identify cases which match 9 digits then one letter
CRMMatch <- grepl("^\\d{9}[[:alpha:]]$", as.character(x$HospitalNumber))
#Create columns from Hospital number among the matches or those that do not match
x$CRN[CRMMatch] <- as.character(x$HospitalNumber)[CRMMatch]
x$TIT[!CRMMatch] <- as.character(x$HospitalNumber)[!CRMMatch]
# clean up by removing the variable created of matches
rm(CRMMatch)

A dplyr версия может быть

library(dplyr)
x <-
  x %>% 
  mutate(CRN = if_else(grepl("^\\d{9}[[:alpha:]]$", as.character(HospitalNumber)),as.character(HospitalNumber), NA_character_),
         TIT = if_else(!grepl("^\\d{9}[[:alpha:]]$", as.character(HospitalNumber)),as.character(HospitalNumber), NA_character_))
5
задан Mihai Limbășan 21 December 2008 в 14:35
поделиться

6 ответов

Обычный путь, используйте #ifdef и #define в Ваших заголовочных файлах

внутри game.h:

#ifndef GAME_H
#define GAME_H

.. rest of your header file here

#endif

Таким образом, содержание будет считано многократно, но только определено однажды.

Править: Удаленные символы нижнего подчеркивания в запуске и конце идентификатора на комментарии.

17
ответ дан 18 December 2019 в 05:23
поделиться

Ключ является предописанием. Возьмите материал от game.h это требуется в socket.h (или наоборот), и вперед - объявляют это в еще одном заголовке, например. game_forwards.h. Как пример, рассмотрите следующее:

// game_fwd.h

#ifndef GAME_FWD_H
#define GAME_FWD_H

class game;

#endif // ndef GAME_FWD_H

// game.h

#ifndef GAME_H
#define GAME_H

#include "socket.h"

class game {
    socket* m_sck;
};

#endif // ndef GAME_H

// socket.h

#ifndef SOCKET_H
#define SOCKET_H

#include "game_fwd.h"

class socket {
    game* m_game;
};

#endif // ndef SOCKET_H

Очевидно, чтобы это работало, важно разделить интерфейс и реализацию.

9
ответ дан 18 December 2019 в 05:23
поделиться

Для полноты другая альтернатива:

#pragma once 

наверху файла.

Это имеет преимущество, что файл неоднократно не открывается, сохраняя время компиляции.

Это имеет недостаток того, чтобы не быть стандартным, таким образом, не все компиляторы поддерживают его. Работы надежно в Visual C++.

3
ответ дан 18 December 2019 в 05:23
поделиться

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

8
ответ дан 18 December 2019 в 05:23
поделиться

Нет никакого изящного пути вокруг этого, что я могу думать - Ваш лучший выбор состоит в том, чтобы передать - определяют функции, которые будут на самом деле использоваться. Так, если game.h только использует подключение () функция от socket.h, добавьте эту строку к game.h:

void connect();

И удалите импорт socket.h. Конечно, если подпись подключения () изменится, то необходимо будет не забыть обновлять вперед определение также, таким образом, это решение будет далеко от идеала. Если Вы возможно можете, изменить дизайн для предотвращения круговых зависимостей.

Если game.h просто должен знать о классе в socket.h, вперед определите его как это:

class Socket;

Существуют некоторые протесты когда дело доходит до подставляемых функций и членских объектов, видят Облегченный FAQ C++.

1
ответ дан 18 December 2019 в 05:23
поделиться

@lassevk, не был должен, это быть "заголовочным файлом будет несколько раз открываться, но препроцессор только считает содержание файла между #ifndef и #endif однажды, во время первого чтения. После того, как затем препроцессор проигнорирует bewteen макросы PP, потому что _GAME_H был определен".

0
ответ дан 18 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

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