【问题标题】:expected class-name before '{' token with no headers'{' 标记之前的预期类名,没有标题
【发布时间】:2011-07-25 18:15:07
【问题描述】:

我对手头错误的答案感到很困惑。

我有一个想要继承的类。但是当我尝试继承时,我得到了上述错误。 这些类都不使用头文件,因为我这样做只是为了了解虚拟覆盖的工作原理。我对 C++ 很陌生。所以这并不是要真正做点什么,更像是更好地理解 C++。

当我在谷歌上寻找答案时,它通常以头文件和“#include”关键字的问题告终。

而且也没有太多代码可以使用。 有什么建议么?

编辑:

就像我说的代码不多,我没有包含的其他文件也与钢琴家没有什么不同

   /* 
 * File:   main.cpp
 * Author: Sidar
 *
 * Created on 19 juli 2011, 17:51
 */

#include <cstdlib>
#include <iostream>
#include "Musician.cpp"
#include "Pianist.cpp"
#include "MasterPianist.cpp"
#include "JuniorPianist.cpp"


using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {
    Musician *m = new Musician();
    Pianist *p = new Pianist();
    //JuniorPianist *jp = new JuniorPianist();
    MasterPianist *mp  = new MasterPianist();
    //__________________________
    cout << "Pianist greets:\n";
    m->greet();
    cout << "And this is a:\n";
    m = p;
    m->greet();
    cout << "The pianist states his proffesion:\n";
    m = mp;
    m->greet();
    cout << "And this is his student:\n";
   // m = jp;
    m->greet();

    return 0;
}

要继承的类

    #include <iostream>
using namespace std;

class Musician{

public:
    //Constructors
    Musician(){}
    Musician(const Musician& m){}
    ~Musician(){}
    //Methods/Functions
    virtual void greet(){
        cout << "Hello";
    }
};

试图继承的类。

 /* 
 * File:   Pianonist.cpp
 * Author: Sidar
 * 
 * Created on 19 juli 2011, 17:58
 */

#include <iostream>
using namespace std;

class Pianist: public Musician {

public:
    Pianist(){}
    Pianist(const Pianist& orig){}
    ~Pianist() {}
    //____________________________________
    void greet(){
        cout << " This is  pianist";
    }
};

【问题讨论】:

  • 代码不多,贴出来怎么样?从描述中很难猜出问题出在哪里,但如果我不得不猜测,我会在其中一个类定义中说缺少;
  • 为什么要包含实现文件?
  • 指向错误所在的行
  • 你在class Pianist: public Musician得到错误我猜?
  • @Bart,是的,它来自那条线。

标签: c++ class token


【解决方案1】:

您的class Pianist 似乎继承自文件Pianist.cpp 中的Muscician(应重命名为Pianist.hpp),但该文件不包括Musician.cpp(应重命名为Musician.hpp)等等不知道Muscician 是什么。 您想将 Musicain 的定义包含在 Pianist.hpp 中

现在,当您这样做时,您可能会发现编译器不止一次地传递了这些文件中的每一个,从而违反了单一定义规则。为了克服这个问题,您需要为每个包含的文件添加包含防护。尝试将#pragma once 添加为每个头文件的第一行。 (注意 #pragma once 不是跨平台的,但大多数实现都支持它,所以在您对该语言更加熟悉之前应该没问题)。

总之,

  1. 重命名 Musician.cpp -> Musician.hpp(同样适用于 Pianist)。这些是头文件(您将它们包含在 main.cpp 中)
  2. #include "Musician.hpp" 添加到 Pianist.hpp(以便 Musician 类可以找到 Musician 类的定义(和实现)。
  3. #pragma once 添加到所有.hpp 文件的顶部。

然后给出完成此操作后遇到的任何编译器错误。

【讨论】:

  • 只是好奇:为什么让include guards 听起来如此神秘? :) 这是一个非常简单的概念,在更熟悉该语言之前我不会避免。
  • @Bart,很公平——我并不是想让它们听起来很神秘。但是,它们需要大量输入,并且如果您忘记在文件末尾解锁保护(或在两个不同文件中使用相同的保护名称),可能会导致奇怪的编译器消息。事实上,这个问题可能是关于编译器无法找到一段代码,这个问题可能是由错误使用的守卫引起的。另一方面,#pragma once 肯定不会导致 Sidar 遇到的问题。
  • 我几乎听不懂你在说什么。 hpp不是表示头文件吗?我没有使用标题...
  • @Sidar,您正在使用标题 - 您在其他文件中包含标题。您刚刚(错误地)调用了它们的 cpp 文件。
  • 我们说的是you should have,而不是你确实有。也就是说,您应该将代码分成头文件(.hpp 或 .h)和实现(.cpp)文件。实际上,汤姆正在给你我暗示的答案。然后,您可以随后在 Pianist.cpp 中包含适当的头文件 (Musician.h),这样它就知道您指的是这个 Musician。
猜你喜欢
  • 1970-01-01
  • 2021-09-22
  • 2015-01-19
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多