2012-05-30 31 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小时前”文本上,您会看到时间戳) - 但他的确提供了一些有用的建议,所以他应该得到接受的答案。 –