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”,因为它没有标题保护
我已经阅读了关于如何使用包含和整体的不同意见我只是觉得在理解组织代码以防止他的正确方法时是一个菜鸟。
非常感谢任何指导!
答案 0 :(得分:1)
不要#include
cpp文件。它不是必需的,而且是造成这个问题的原因。
#pragma once
与包含守卫相同 - 但请记住它不可移植 - 它是您当前编译器特有的。
你的cpp文件中不应包含警戒,因为你不应该#include
。
答案 1 :(得分:0)
答案 2 :(得分:0)
您只需要包含头文件,而不是.cpp文件。
您不希望在.cpp文件中使用标题保护。
这里不需要转发声明(尽管你可以使用它)
您的实现不包括“子类包含”,它们包括定义其接口的头文件。你在g.h中包含的a.h是正确的。