我正在尝试编写一系列使用相同main(main.cpp)文件的程序,但使用不同的辅助源文件(object1.cpp,object2.cpp等)。所以我将基本上这样编译它们:
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 :(得分:6)
不,你没有。制作工厂方法无法使其工作,因为我需要在main.cpp中包含MyObject的类声明
* H:
MyObjectInterface* makeObject();
* CPP:
MyObjectInterface* makeObject(){
return new MyObject;
}
但是,在不同文件中声明具有相同结构的同名类可能会在某些情况下混淆某些编译器(很少见,但可能会发生)。
此外,更好的解决方案是重新考虑您的程序结构。因为派生类应该具有不同的数据成员,这意味着您可能需要访问这些数据成员。因为您可能需要访问那些memebrs,所以您需要知道关于该类的某些内容,因此您必须将其声明放入标题中。
另一个问题是类代表某种概念,因此选择唯一名称应该是相当简单的。如果您有许多具有SAME名称的不同类,则可能存在设计问题 - 您的类不代表独特的概念,并且您不必要地创建了太多类。
答案 1 :(得分:3)
一种可能的解决方案是在object.hpp
:
MyObjectInterface * createInstance();
并在两个.cpp
文件中实现它:
MyObjectInterface * createInstance() {
return new MyObject();
}
并替换
x = new MyObject(1);
通过
x = createInstance();