2012-05-30 36 views
4

我正在嘗試編寫一系列使用相同main(main.cpp)文件但具有不同輔助源文件(object1.cpp,object2.cpp等)的程序。因此,我將主要編譯它們是這樣的:C++使用不同文件中的類

g++ -o program1.exe main.cpp object1.cpp 
g++ -o program2.exe main.cpp object2.cpp 

我想要做的是有objectN.cpp定義與實現的某些方法,這將在主文件被稱爲類。源代碼是這個樣子:

頭文件(object.hpp)

#ifndef INCLUDE_OBJECT_HPP 
#define INCLUDE_OBJECT_HPP 

class MyObjectInterface 
{ 
public: 
    MyObjectInterface(); 
    virtual ~MyObjectInterface() {}; 
    virtual void MethodA() = 0; 
    virtual void MethodB() = 0; 
}; 

#endif 

object1.cpp

#include <iostream> 
#include "object.hpp" 

using namespace std; 

class MyObject : public MyObjectInterface 
{ 
private: 
    int member; 

public: 
    MyObject(int a) { member = a; } 
    void MethodA() { cout << member << endl; } 
    void MethodB() { cout << member*2 << endl; } 
}; 

的main.cpp

#include <iostream> 
#include "object.hpp" 

using namespace std; 

MyObjectInterface *x; 

int main() 
{ 
    x = new MyObject(1); 
    x->MethodA(); 
    x->MethodB(); 
    return 0; 
} 

object2.cpp會與object1.cpp具有相似的結構,但該類將具有不同的數據成員。

我不能得到這個工作,因爲我需要在main.cpp中包含MyObject的類聲明。但是每個對象的* .cpp文件都會用不同的成員聲明MyObject類,所以我不能簡單地製作一個單獨的object.hpp頭並將其包含在main中,因爲我需要不同對象的頭。主要唯一需要知道的是方法。

我希望我已經清楚地解釋了這個問題;如果不發表評論,我會盡力澄清。似乎應該有一個非常簡單的方法來做這樣的事情,但我無法弄清楚。

感謝

+0

你應該看看[工廠設計模式](http://en.wikipedia.org/wiki/Factory_method_pattern),這對創建main()中使用的具體類很有用。 –

回答

5

不能得到這個工作,因爲我需要包括的MyObject的類聲明中的main.cpp

不,你不會。做一個工廠方法

的* .h:

MyObjectInterface* makeObject(); 

*的.cpp:

MyObjectInterface* makeObject(){ 
    return new MyObject; 
} 

不過,在同名類在不同的文件中聲明可能會混淆一些編譯器在相同的結構某些情況(罕見的事情,但可能發生)。

此外,更好的解決方案是重新考慮你的程序結構。因爲派生類應該有不同的數據成員,這意味着您可能需要訪問這些數據成員。因爲您可能需要訪問這些memebrs,那麼您需要知道關於該類的,因此您必須將其聲明放入標題中。

另一個問題是類代表某種概念,所以選擇獨特的名稱應該是相當平凡的。如果您有許多與SAME名稱不同的類,您可能會遇到設計問題 - 您的類不代表獨特的概念,並且您無用地創建了太多的類。

+0

+1好的建議,即使OP不知道它是需要的 – djechlin

+0

感謝您的答案,工作。 至於改變程序結構 - 我同意這不一定是最好的。然而,我在OP中輸入的代碼只是這個問題的一個例子。我正在開發的實際程序要大得多,而且重構代碼需要很多努力。 – smead

3

一個可能的解決方案是在object.hpp聲明此功能:兩個.cpp文件

MyObjectInterface * createInstance(); 

,並實現它是這樣的:

MyObjectInterface * createInstance() { 
    return new MyObject(); 
} 

並更換

x = new MyObject(1); 

通過

x = createInstance(); 
+0

感謝您的快速回復,即使其他人在1分鐘前給出了相同的答案:P – smead

+0

@smead:事實上,我在他/她之前回答了28秒(將鼠標懸停在「X小時前」文本上,您會看到時間戳) - 但他的確提供了一些有用的建議,所以他應該得到接受的答案。 –