2012-01-31 53 views
-1

我创建了一个功能的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在他的文件之一(因为它是有道理的,但并不像被要求约定文件名)

+0

你不每个功能都需要'public:'。在'public:'之后,所有声明的函数和变量都是公共的,直到范围被改变(例如'private:'或'protected:')。 – 2012-01-31 07:48:39

+0

界定公共,私有和保护的每一件事情其实来自我用java的经验,但无论编译器不会造成任何问题,而且是一个子集标准不是主。如果是这样的问题,那么,当我在一个文件让他们为什么会工作,而不是给定的地址问题的答案的头 – gardian06 2012-01-31 12:21:49

+0

非。他们只是风格习惯的修辞。 – gardian06 2012-01-31 12:33:54

回答

2

你包括警卫被打破:

#ifndef Object1_H 
#define Object1_h 

你有_H在一个结束和_h在另一结束。这导致包括警卫不工作。

另外,您不需要也不希望在您的实现文件中包含警卫。无论如何它们不应该被包含在任何东西中。

+0

感谢你的观察,但固定不改变我收到 – gardian06 2012-01-31 12:25:31

+0

错误的错误是类似的观察,但居住在另一使用相同的#define文件 – gardian06 2012-01-31 20:23:04

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

包含标题,源文件被编译和链接。 – 2012-01-31 07:43:21

+0

'的#pragma once'是不可移植的 – 2012-01-31 07:50:44

+0

你需要的#include,如果你在物理指导编译器包含的东西,切实如果曾经有一个机会的东西可能被包含两次,你应该有它警卫。它是用C真实的它在C++真实的,这甚至不触及问题 – gardian06 2012-01-31 12:24:49

0

的错误是,你用你的构造函数和析构函数的声明范围:

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

内部类(或结构),你不需要说:

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

不应该进行直接的区别(反对使用文件名后卫的应用项目标准进行),并且可能是依赖于语言的。我这样做是因为我使用java的经验。 – gardian06 2012-01-31 12:29:15

+0

@ gardian06它确实有所作为,您实际上在您的问题中注意到了自己的差异。在类内部,当声明成员函数或变量时,不应该使用scope-operator('::')。是的,它绝对是语言依赖的,不管使用其他语言的语法,无论多么相似,并且期望它以相同的方式工作。 – 2012-01-31 12:45:01