2011-03-14 89 views
0

我正在使用Eclipse CDT。這個想法是,我想在一個項目中管理10個小練習(10個無關的問題),因爲它似乎沒有優化創建10個項目。我正在使用這樣的模型: 有一個cpp文件,其中包含名爲「Controller.cpp」的main(),後跟它的頭文件「Controller.h」。每個問題1類,例如:「ex1.cpp」&「ex1 .h「 - >共22個文件。在main()中,我使用開關來選擇要解決的問題。然而,不知道爲什麼,但每個班級,我必須鍵入「.cpp」功能的原型和「 .h」(內部和外部類別)的原型以使其工作:在1個C++項目中管理多個子項目的最佳方法?

「控制器的.cpp「:

#include "Controller.h" 
#include "E2P4.h" 
#include "E3P3.h" 
#include "E3P4.h" 
#include "E3P6.h" 
#include "E4P1.h" 
#include "E4P2.h" 
#include "E4P3.h" 
#include "E4P4.h" 
#include "E7P6.h" 
#include "E7P6Apps.h" 
#include "E7P7.h" 
#include "E7P7Apps.h" 
#include <iostream> 
#include <string> 
using namespace std; 

int main(){ 
    string choice; 
    cout << "Enter choice :" << endl; 
    cin >> choice ; 

    if (choice.compare("E2P4") == 0){ 
     E2P4 A; 
     A.Do(); 
    } 
    else if (choice.compare("E3P3") == 0){ 
     E3P3 A; 
     A.Do(); 
    } 
    else if (choice.compare("E3P4") == 0){ 
     E3P4 A; 
     A.Do(); 
    } 
    else if (choice.compare("E3P6") == 0){ 
     E3P6 A; 
     A.Do(); 
    } 
    else if (choice.compare("E4P1") == 0){ 
     E4P1 A; 
     A.Do(); 
    } 
    else if (choice.compare("E4P2") == 0){ 
     E4P2 A; 
     A.Do(); 
    } 
    else if (choice.compare("E4P3") == 0){ 
     E4P3 A; 
     A.Do(); 
    } 
    else if (choice.compare("E4P4") == 0){ 
     E4P4 A; 
     A.Do(); 
    } 
     else if (choice.compare("E7P6") == 0){ 
       E7P6apps(); 
     } 
     else if (choice.compare("E7P7") == 0){ 
      E7P6apps(); 
     } 
    else cout << "Wrong command !!!" ; 
     return 0; 
} 

Controller::Controller() { 
    // TODO Auto-generated constructor stub 

} 

Controller::~Controller() { 
    // TODO Auto-generated destructor stub 
} 

練習:

#ifndef _H_ 
#define _H_ 
void Do(); 

class E2P4 { 
public: 
    void Do(); 
    E2P4(); 
    virtual ~E2P4(); 
}; 

#endif /* _H_ */ 

和:

#include "E2P4.h" 
#include <iostream> 
void Do(); 

void E2P4::Do(){ 
    std::cout << "Please input Celsius degree :" << std::endl; 
    double d; 
    std::cin >> d ; 
    double converted = 1.8 * d + 32 ; 
    std::cout << d << " C degree corresponds " << converted << " F degree"; 
} 

E2P4::E2P4() { 
    // TODO Auto-generated constructor stub 

} 

E2P4::~E2P4() { 
    // TODO Auto-generated destructor stub 
} 

,這是非常無聊的,因爲每個功能我都要複製原型3次。

雖然最近我找到了另一種方法,而不是每個問題都對待一個類。我在main()中使用「ex1.cpp」,「ex1.h」,「ex1Application.cpp」和「ex1Application.h」與「Controller.cpp」中的main介體「ex1Application.cpp」。也只需要一次原型。但它完全需要41個文件。

有沒有更好的想法來管理這些?

回答

-1

答案是使用子類。

// Exercises.h 
class Exercises { 
    public: 
    Exercises(); 
    virtual void Do(); 
    virtual ~Exercises(); 
} 

// Exercises.cpp 
// (Ignoring inline for now; you'll learn about that later) 
#include "Exercises.h" 
Exercises::Exercises() {} 
void Exercises::Do() {} 
Exercises::~Exercises() {} 

現在,每個類的使用練習作爲父類:

// E2P4.h 
#include "Exercises.h" 
class E2P4 : public Exercises { 
    E2P4(); 
    void Do(); 
    virtual ~EP24(); 
} 

// E2P4.cpp -- same as before 
#include "E2P4.h" 
E2P4::E2P4() { /* Whatever */ } 

void E2P4::Do() { /* Whatever */ } 

E2P4::~E2P4() { /* Whatever */ } 

現在的main()只需要知道班級在創建時的作用該對象,而不是當您使用它時:

// Main.cpp 
void main() { 
    // ... 

    // Create the object 
    Exercise *e; 
    switch (which_class) { 
     case E2P4: e = new E2P4(); 
     // ... 
    } 

    // Use the object 
    (*e).Do(); 

    // When you're finished, you need to delete... 
    // I see you've already learned about virtual 
    // destructors, so this shouldn't be difficult. 
    delete e; 
} 
+0

'Do()'和'〜Excercises()'需要**虛擬**,在類「練習」中爲解決方案工作。修正'main()'中類名'Exercise'的錯字。 – Mahesh 2011-03-15 00:06:38

+0

-1:你的基類應該有一個虛擬的析構函數,如果它的目的是作爲一個接口,那麼'Do'應該在基類中聲明爲虛擬的或純虛擬的,這種方法建議隱式向下轉換,原始堆分配可能不是甚至是必要的,在這種情況下你應該更喜歡智能指針。這從根本上說不是比單獨的類更簡單或更優雅的設計。 – AJG85 2011-03-15 00:09:11

+0

@ AJG85 - 這是建議上傳,這是隱含的。不是向下傾斜。 – Mahesh 2011-03-15 00:11:46

相關問題