c ++:收到很多错误。简单的继承导致错误的数量

时间:2016-04-17 22:32:25

标签: c++ inheritance compiler-errors header-files

下面是我的3个cpp文件和2个头文件。我收到了一个天文数字的错误,大多数都很不清楚。我是c ++的新手,拥有C#/ Java背景。

我明白以下可能是语法错误。感谢您的帮助。

Main.cpp的:

onResponse()

B.h:

#include <iostream>
#include "B.h"
#include "S.h"

using namespace std;

int main() {
    B b;
    S s("Jon");
    return 0;
};

B.cpp:

#ifndef B_H
#define B_H

class B {
    public:
        B();
};

#endif

S.H:

#include <iostream>
#include <string>
#include "B.h"
#include "S.h"

using namespace std;

class B {
    public:
        B() {}
};

S.cpp:

#ifndef S_H
#define S_H

class S: public B {
    public:
        S(string name);
}
#endif

这是我的错误列表。这有点压倒性。

enter image description here

2 个答案:

答案 0 :(得分:4)

1)您无法在标题中定义类,并在某些源文件中重新定义它。

类的(前向)声明是如下声明:

class X;

类的定义类似于:

class X
{
  // stuff
};

这样的定义可能只对每个班级出现一次。

如果您不希望将数据成员作为公共接口的一部分,则可以

  1. 使用opague pointer将其完全隐藏在标题或
  2. 让这些成员保密。
  3.   

    B.h

    #indef B_H
    #define B_H
    #include <string> // to be used here, so we need to include it
    // not "using namespace std;" here!! *
    class B 
    {
    public:
        B();
        void setValues();
        std::string printValues() const; // don't miss that std::
    private:
        std::string s, result;
        float f;
        int i;
        bool b;
    };
    #endif
    
      

    B.cc

    #include "B.h"
    
    B::B() 
        : f(), i(), b() // **
     { }
    
    void B::setValues() { }
    
    std::string printValues() const
    {
        result = s + " " + std::to_string(i) + " " + 
            std::to_string(f) + " " + std::to_string(b);
        return result;
    }
    
      

    S.H

    #ifndef S_H
    #define S_H
    #include "B.h" // required to make B known here
    #include <string> // known through B, but better safe than sorry
    class S : public B 
    {
    public:
        S(std::string name);
        std::string subPrint() const; // ***
    };
    #endif
    
      

    S.cc。

    #include "S.h"
    
    S::S(std::string name) 
        : s{name} // **
    { }
    
    std::string subPrint () const // ***
    {
        return printValues() + s;
    }
    

    *:Why is “using namespace std” in C++ considered bad practice?

    **:C++, What does the colon after a constructor mean?

    ***:Meaning of “const” last in a C++ method declaration?

    2)您必须在使用类型的任何地方包含必需的标题。

    您的B.h不包含但使用string我怀疑是std::string

答案 1 :(得分:1)

嗯,你的代码中有很多错误。我的建议是逐一减少这些错误,并查看被确定为罪魁祸首的行。

我还建议您查看如何声明一个类以及如何定义它的成员。例如,B.h和B.cpp都定义了一个B类,但是以不同的方式这样做。然后S.h重新定义了B类。

您的代码太破碎了,我们无法一块一块地修复它。在查看了令您困惑的C ++区域之后,您需要重新启动,例如声明和定义类及其成员。 Wikipedia has a good introduction。请记住,当定义与声明分开时,您不能再次使用class S { ... },而是使用S::member格式来介绍定义。