2012-01-31 74 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