'{'标记之前的预期类名 - 包含头文件和cpp文件

时间:2018-01-16 02:25:42

标签: c++ inheritance polymorphism header-files

就像很多人提出这个问题一样,我对C ++很陌生,我无法解决这个错误:

Dollar.h:4:31: error: expected class-name before '{' token
    class Dollar: public Currency {

这些是我的文件

的main.cpp

#include <iostream>
#include "Dollar.h"

using namespace std;

int main() {
    Dollar * d = new Dollar();
    d->printStatement();
    return 0;
}

Currency.cpp

#include <iostream>
#include "Currency.h"

using namespace std;

class Currency {
    public:
        virtual void printStatement() {
            cout << "I am parent";
        }
};

Currency.h

#ifndef CURRENCY_H
#define CURRENCY_H

class Currency {
    public:
        virtual void printStatement();
};

#endif

Dollar.cpp

#include <iostream>
using namespace std;

void printStatement() {
    cout << "I am dollar";
}

Dollar.h

#ifndef DOLLAR_H
#ifndef DOLLAR_H

class Dollar : public Currency {
    public:
        void printStatement();
};

#endif

非常感谢你的时间,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

该错误表示此类的名称预计位于: public{之间:

class Dollar : public Currency {
                      ^^^^^^^^

Currency不是类的名称,因为您尚未定义此类。是的,您已在文件Currency.cppCurrency.h中定义了此类,但未在发生错误的文件Dollar.h中定义。

解决方案:必须首先定义类Currency,然后才能将其用作基类。像这样:

// class is defined first
class Currency {
    public:
        virtual void printStatement();
};

// now Currency is a class and it can be used as a base
class Dollar : public Currency {
    public:
        void printStatement();
};

由于必须在使用它的所有源文件中定义类,并且所有源文件的定义必须相同,因此在单独的“标题”文件中定义类通常很有用,例如您已经完成的。在这种情况下,您可以简单地包含该标头,而不是在每个源文件中重复编写定义:

#include "Currency.h"

Currency.cpp包含类Currency的两个定义。一旦进入包含的标题,然后在第二次之后。单个源文件中的同一个类可能没有多个定义。

解决方案:从Currency.cpp中删除类定义。而只是定义成员函数:

void Currency::printStatement() {
    //...
}

最后,您尚未定义Dollar::printStatement。你定义了printStatement,这不是一回事。