拆分实现和标头时出错

时间:2012-01-31 07:30:43

标签: c++ windows

我创建了一个使用大量类的功能性OOP程序,我收到了一堆没有意义的错误。我正在开发一个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 个答案:

答案 0 :(得分:2)

  1. 您不需要cpp文件中的警卫。 #ifndef/#define/#endif仅在标题中有必要。
  2. 您实际上可以使用#pragma once进行防护。
  3. 不要包含cpp文件,只包含标题。你的main.cpp应该有一个#include "object11.h"

答案 1 :(得分:2)

你的包裹警卫坏了:

#ifndef Object1_H
#define Object1_h

您在一端的_H和另一端的_h。这导致包含警卫无法工作。

此外,您不需要,也不要在您的实施文件中加入警卫。无论如何,它们永远不应被包括在内。

答案 2 :(得分:0)

错误是你在构造函数和析构函数声明中使用了作用域:

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

在类(或结构)中,您不需要:

class Object1 {
public:
    Object1();
    ~Object1();
};