ошибки при разбиении реализации и заголовка - PullRequest
0 голосов
/ 31 января 2012

Я создал функциональную программу ООП, которая использует кучу классов, и получаю кучу ошибок, которые не имеют смысла. Я работаю над проектом Windows VC ++ 2008, и в начале я пытался иметь другую реализацию и заголовочные файлы. когда я пытался, например, сделать object1.cpp

#ifndef Object1_cpp
#define Object1_cpp

#include "Object1.h"

Object1::Object1(){
   ...
}
Object1::~Object1(){
   ...
}
....
#endif

object1.h

#ifndef Object1_H
#define Object1_h
class Object1{
public: Object1();
public: ~Object1(); // line 39 of object1.h
...
};
#endif

main.cpp

#include "object1.cpp"

иногда это возвращает ошибки

1>c:...\object1.h(39) : error C2059: syntax error : '('
1>c:...\object1.h(39) : error C2238: unexpected token(s) preceding ';'

и поскольку он не жалуется на конструктор, единственное, что приходит на ум, это '~', указывающее деструктор. когда я убираю .h из картинки, меняя .cpp на

#ifndef Object1_H
#define Object1_h
class Object1{
public: Object1::Object1();
public: Object1::~Object1();
...
};
#endif

или

#ifndef Object1_H
#define Object1_h
class Object1{
public: Object1();
public: ~Object1();
...
};
#endif

хорошо компилируется. Я не понимаю это когда я делал что-то подобное в прошлом на других компиляторах, это прекрасно работает, но не здесь. в настоящее время программа полностью функциональна, хотя я игнорирую существование файлов .h и делаю все в файлах .cpp. похоже, что компилятор создает проблему с оператором Til-de, обозначающим деструктор. это только один из примеров проблемы, которая возникает во всех моих классах, когда я пытаюсь разделить реализацию и пересылать ссылки.

найдено решение. очевидно, один из моих товарищей по команде использовал один и тот же #define в одном из своих файлов (потому что это имело смысл, но не являлось именем файла, как требовалось соглашение)

Ответы [ 3 ]

2 голосов
/ 31 января 2012

Ваши включенные охранники сломаны:

#ifndef Object1_H
#define Object1_h

У вас есть _H в конце одного и _h в конце другого.Это приводит к тому, что include guard не работает.

Кроме того, вам не нужно и не нужно включать охранники в ваши файлы реализации.В любом случае они никогда не должны быть включены.

2 голосов
/ 31 января 2012
  1. Вам не нужны охранники в файле cpp. #ifndef/#define/#endif необходим только в заголовке.
  2. Вы можете использовать #pragma once для охраны.
  3. Не включать файлы cpp, только заголовки. Ваш main.cpp должен иметь #include "object11.h"
0 голосов
/ 31 января 2012

Ошибка в том, что вы используете область в своих объявлениях конструктора и деструктора:

class Object1{
public: Object1::Object1();
// Here ^^^^^^^^^

Внутри класса (или структуры) вам это не нужно:

class Object1 {
public:
    Object1();
    ~Object1();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...