C ++解决这种继承问题的正确方法包括问题“已经有了一个体”?

时间:2013-05-22 01:23:45

标签: c++ inheritance include dependencies header-files

Heyo,我对我在C ++中遇到的这个问题有疑问。我是C ++和学习的新手。我有面向对象编程的经验,所以我正在寻找正确的方法并解决这个问题以及为什么要这样做。

我已将每个类分成接口头文件和实现cpp文件。

第一堂课“Alpha”是我的基类:

// a.h
#pragma once

class Alpha
{
public:
    virtual void myFunction();
};

Alpha实施:

// a.cpp
#include <iostream>
#include "a.h"

void Alpha::myFunction()
{
    std::cout << "Class Alpha myFunction" << std::endl;
}

然后我有一个子类“Beta”:

// b.h
#pragma once
#include "a.h"
#include "a.cpp"

class Beta : public Alpha
{
public:
    virtual void myFunction();
};

Beta实施:

// b.cpp
#include <iostream>
#include "b.h"

void Beta::myFunction()
{
    std::cout << "Class Beta myFunction" << std::endl;
}

然后,我将拥有一个名为“Gamma”的经理类。

// g.h
#pragma once
#include <vector>
#include "a.h"
#include "a.cpp"

class Gamma
{
public:
    void run();
    std::vector<std::shared_ptr<Alpha>> alphaCollection;
};

Gamma实施:

// g.cpp
#include "g.h"
#include "b.h"
#include "b.cpp"

void Gamma::run()
{
    Beta localBeta;

    alphaCollection.push_back(std::make_shared<Beta>(localBeta));

    // example usage
    alphaCollection.at(0)->myFunction();
}

然后我的主要是:

#include "g.h";
#include "g.cpp";

int main()
{
    Gamma objectG;
    objectG.run();
}

为什么我这样做

所有这一切的目的是我想在我的管理器中使用基类Alpha的向量,然后我可以插入不同数量的基类对象的元素。

我使用Beta作为派生类的一个例子,但在实际实现中会有更多派生类,如Charlie,Delta等。

目标是我的经理类Gamma能够将矢量元素作为Alpha对象进行操作,并且每个子类都执行自己的行为。

问题

我无法编译上面的例子,因为Gamma的实现文件包含“gh”和“bh”,其中每个包含“ah”和“a.cpp”因此加倍包括“a.cpp”,因为它没有标题保护

  • 错误C2084:函数'void Alpha :: myFunction(void)'已经有一个正文a.cpp
  • 错误C2264:'Alpha :: myFunction':函数定义或声明中的错误;函数不称为g.cpp

我已经阅读了关于如何使用包含和整体的不同意见我只是觉得在理解组织代码以防止他的正确方法时是一个菜鸟。

  1. 我非常混乱吗?
  2. 实施文件是否也应使用​​标题保护?
  3. 我应该使用前瞻声明吗?如果是这样的话?
  4. 我是否疯狂希望实现包含子类包含虽然标题包含基类只包括?
  5. 非常感谢任何指导!

3 个答案:

答案 0 :(得分:1)

不要#include cpp文件。它不是必需的,而且是造成这个问题的原因。

#pragma once与包含守卫相同 - 但请记住它不可移植 - 它是您当前编译器特有的。

你的cpp文件中不应包含警戒,因为你不应该#include

答案 1 :(得分:0)

停止#including .cpp文件。 .h是你所需要的最多,有时只需要一个前瞻声明即可。 Hereherehere可以很好地描述他们所服务的目的。

答案 2 :(得分:0)

您只需要包含头文件,而不是.cpp文件。

您不希望在.cpp文件中使用标题保护。

这里不需要转发声明(尽管你可以使用它)

您的实现不包括“子类包含”,它们包括定义其接口的头文件。你在g.h中包含的a.h是正确的。