麻烦单独的文件中的各种c ++类的标头

时间:2018-04-06 11:16:53

标签: c++ oop

我有5个文件,一个主文件和两个带有两个头文件的类:

文件main.cpp:

#include "parent.hpp"
#include <iostream>

int main (){
    Parent parentInstance;
    parentInstance.function();
    return 0;
}

文件parent.hpp:

class Parent {
    public:
        void function();
};

文件parent.cpp:

#include "child1.hpp"

 void Parent::function() {
    Child1 Child1Instance;
    Child1Instance.speak();
}

file child1.hpp:

#include "parent.hpp"
#include <iostream>

class Child1 : public Parent {
    public:
        void speak();
};

file child1.cpp:

#include "child1.hpp"

void Child1::speak () {
    std::cout << "Hi, I'm child1" << '\n';
    }

它编译和工作没有任何问题,尽管它可能是通过不良做法完成的。当我尝试添加一个带有自己的cpp和hpp文件的新类时,问题就出现了,这个文件名为Child2,它的代码与Child1基本相同,但我不知道如何正确组织标题以使这段代码有效:

 void Parent::function() {
    Child1 Child1Instance;
    Child2 Child2Instance;
    Child1Instance.speak();
    Child2Instance.speak();
}

然后回复我:

Hi, I'm child1 
Hi, I'm child2

2 个答案:

答案 0 :(得分:2)

一些规则:

  1. 标头文件始终包含include guards(或#pragma once)。
  2. 每个.cpp都包含相应的.hpp作为其第一条(非评论)行。
  3. 仅包含.cpp明确用于.cpp
  4. 的内容

    这可以解决你的大部分问题。

    一些解释:

    1. 如果没有警卫,您最终可以传递两次相同的文件,包括a.hb.h,但b.h已包含a.h ...导致一些令人困惑的重新定义错误。
    2. 您必须包含标题,以便.cpp中的函数 definitions 对应.hpp中的声明。把它放在第一行就是很好的做法。
    3. 如果您在其他地方忘记了#include,请准确包含您使用的内容,以避免混淆错误。

答案 1 :(得分:0)

我非常感谢这些评论,我的所有知识都是自学成才......现在问题很容易解决:

main.cpp没有变化。

文件parent.hpp:

#ifndef _PARENT_HPP_
#define _PARENT_HPP_

class Parent {
    public:
        void function();
};

#endif /* _PARENT_HPP_ */

文件parent.cpp:

#include "parent.hpp"
#include "child1.hpp"
#include "child2.hpp"

 void Parent::function() {
    Child1 Child1Instance;
    Child2 Child2Instance;
    Child1Instance.speak();
    Child2Instance.speak();
}

文件child1.hpp和child2.hpp(更改1到2):

#include "parent.hpp"
#include <iostream>

class Child1 : public Parent {
    public:
        void speak();
};

文件child1.cpp和child2.cpp(更改1到2):

#include "child1.hpp"

void Child1::speak () {
    std::cout << "Hi, I'm child1" << '\n';
    }

结果:

Hi, I'm child1
Hi, I'm child2

有效。但是,我想知道是否有任何可以改进的事情或可以纠正的错误。