【问题标题】:C++ using a class from a different fileC++ 使用来自不同文件的类
【发布时间】:2012-06-05 05:24:26
【问题描述】:

我正在尝试编写一系列程序,它们使用相同的主 (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 的类声明。但是每个 object*.cpp 文件都会用不同的成员声明 MyObject 类,所以我不能简单地制作一个单独的 object.hpp 标头并将其包含在 main 中,因为我需要不同的标头用于不同的对象。 main 唯一需要知道的是方法。

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

谢谢

【问题讨论】:

标签: c++ class inheritance interface


【解决方案1】:

一种可能的解决方案是在object.hpp 中声明此函数:

MyObjectInterface * createInstance();

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

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

替换

x = new MyObject(1);

通过

x = createInstance();

【讨论】:

  • 感谢您的快速回复,即使其他人在一分钟前给出了相同的答案:P
  • @smead:实际上,我比他/她早 28 秒回答(将鼠标悬停在“X 小时前”文本上,你会看到时间戳)——他确实提供了一些有用的建议,不过,所以他应该得到公认的答案。
【解决方案2】:

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

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

*.h:

MyObjectInterface* makeObject();

*.cpp:

MyObjectInterface* makeObject(){
    return new MyObject;
}

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

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

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

【讨论】:

  • +1 提供好的建议,即使 OP 不知道需要它
  • 感谢您的回答,这很有效。至于改变程序结构——我同意这不一定是最好的。然而,我在 OP 中输入的代码只是问题的一个例子。我正在处理的实际程序要大得多,重构代码需要花费太多精力。
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多