функции, используемые в нескольких классах - PullRequest
1 голос
/ 10 ноября 2010

Я как-то спрашивал об этом раньше, но я использовал то, что мне сказали, чтобы попытаться заставить мою программу работать:

Это, вероятно, потому что я noob в C ++, но у меня возникают проблемы с использованием #ifndef из-за проблемы, что мои классы содержат те же файлы .h. и s.h, и t.h, и main.cpp нуждаются в структуре, определенной в r.h

у меня есть

#include "s.h"
#include "t.h"

#ifndef r
#include "r.h"
#endlif

в моем главном файле cpp

и в каждом из моих файлов s.h и t.h есть

#ifndef r
#include "r.h"
#endlif
// and then its class

, но компилятор выдаёт мне ошибки о expected nested-name-specifier before "namespace", unqualified id before using namespace std;, expected ';' before "namespace" в файле r.h, хотя все, что у меня есть в файле r.h:

#include <iostream>

using namespace std;
struct r{
// code
};

Проблемы, вызванные тем, что основной cpp не импортирует определенные библиотеки или что-то еще? как мне это исправить?

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

#ifndef должен входить в заголовочные файлы, чтобы не включать его несколько раз. Итак, ваш s.h будет выглядеть примерно так:

#ifndef S_H
#define S_H

// All of your s.h declarations go here

#endif

r.h будет выглядеть примерно так:

#ifndef R_H
#define R_H

// All of your r.h declarations go here

#endif

и т. Д.

Это предотвращает включение заголовочных файлов более одного раза. Если вы включаете один и тот же заголовочный файл несколько раз в один модуль компиляции, компилятор, скорее всего, будет жаловаться, что один и тот же символ объявляется несколько раз. Это может также потенциально вызвать бесконечный цикл во время компиляции, если один и тот же набор заголовков включен рекурсивно.

0 голосов
/ 10 ноября 2010

Директивы компилятора, такие как #include и #ifdef, являются частью "препроцессора C", который на самом деле отличается от языка программирования C. Таким образом, препроцессор не видит ваш struct r. Вам нужно что-то вроде этого в вашем r.h:

#include <iostream>
#define r
using namespace std;
struct something_that_isnt_called_just_r{
// code
};

Вот почему вам лучше использовать традиционные защитные щитки, которые описывает @andand.

0 голосов
/ 10 ноября 2010

Я надеюсь, что вы используете r, s и t для упрощения вашего вопроса.

Возможно ли, что вы думаете, что оператор со "struct r" ОПРЕДЕЛЯЕТ r для вашей программы?

Это два разных вида определений. Одним из них является определение структуры, но вы хотите использовать определение:

#ifndef R_H
#define R_H
#include <iostream>

using namespace std;

struct r{
//code
};

#endif

(как и уже указывалось)

ПРИМЕЧАНИЕ: я использую определение R_H вместо r, чтобы избежать путаницы. Вы хотите использовать r для своей структуры и R_H для определения в заголовке (ну, собственно, имя модуля + "_H").

...