6

我正在尝试编写一系列程序,它们使用相同的主(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

对象1.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; }
};

主文件

#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 的类声明。但是每个 object*.cpp 文件都会用不同的成员声明 MyObject 类,所以我不能简单地创建一个单独的 object.hpp 标头并将其包含在 main 中,因为我需要不同的标头用于不同的对象。main 唯一需要知道的是方法。

我希望我已经清楚地解释了这个问题;如果不发表评论,我会尽力澄清。似乎应该有一种非常简单的方法来做这样的事情,但我想不通。

谢谢

4

2 回答 2

6

不能让它工作,因为我需要在 main.cpp 中包含 MyObject 的类声明

不,你没有。制作工厂方法

*。H:

MyObjectInterface* makeObject();

*.cpp:

MyObjectInterface* makeObject(){
    return new MyObject;
}

但是,在不同文件中声明具有相同结构的同名类可能会在某些情况下混淆某些编译器(很少见,但它可能会发生)。

此外,更好的解决方案是重新考虑您的程序结构。因为您的派生类应该有不同的数据成员,这意味着您可能需要访问这些数据成员。因为您可能需要访问这些 memebrs,所以您需要了解有关该类的一些信息,因此您必须将其声明放入标题中。

另一个问题是类代表某种概念,因此选择唯一名称应该是相当简单的。如果您有许多具有相同名称的不同类,则可能存在设计问题 - 您的类不代表独特的概念,并且您不必要地创建了太多类。

于 2012-05-30T23:01:59.260 回答
3

一种可能的解决方案是在以下位置声明此函数object.hpp

MyObjectInterface * createInstance();

并在两个.cpp文件中像这样实现它:

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

并更换

x = new MyObject(1);

经过

x = createInstance();
于 2012-05-30T23:01:31.540 回答