在下面的代码中,编译时出现错误, 错误 : main.cpp:8:57: 错误:'Staircase' 之前需要类型说明符 std::unique_ptr algodiagnostic (new Staircase());
编译命令 g++ HardwareDiagnostic.cpp HardwareDiagnostic.h main.cpp -std=c++0x -o res
如果在不单独创建头文件和 main.cpp 的情况下将整个代码编译在单个文件中,则效果很好。谁能建议如何解决这个问题。
//HardwareDiagnostic.h//
#ifndef HARDWAREDIAGNOSTIC_H_
#define HARDWAREDIAGNOSTIC_H_
#include <iostream>
#include <memory>
using namespace std;
class HardwareDiagnostic
{
public:
virtual bool checkPort();
virtual void startDiagnostic();
virtual int publishAlgoDiagnosticInfo();
virtual void clearErrorStatus(){cout<<"Algorithm Diagnostics"<<endl;}
virtual ~HardwareDiagnostic() {cout<<"calling virtual destructor"<<endl;}
};
#endif /* HARDWAREDIAGNOSTIC_H_ */
//HardwareDiagnostic.cpp//
#include"HardwareDiagnostic.h"
class Localization : public HardwareDiagnostic
{
public:
Localization() { cout << "calling Localization constructor";}
bool checkPort(){cout<<"checkport :Localization";}
void startDiagnostic(){cout<<"start Diagnostic:Localization";}
int publishAlgoDiagnosticInfo() {cout<<"publish Diagnostic:Localization";}
void clearErrorStatus(){ cout<<"Localization:publish Diagnostic";}
~Localization () { cout<<"calling Localization destructor ";}
};
class Staircase : public HardwareDiagnostic
{
public:
Staircase () {cout<<"Staircase constructor";}
bool checkPort(){cout<<"Staircase";}
void startDiagnostic(){cout<<"StairCase:start Diagnostic";}
int publishAlgoDiagnosticInfo() {cout<<"StairCase:publish Diagnostic";}
void clearErrorStatus(){ cout<<"staircase:publish Diagnostic";}
~Staircase(){cout<<"calling Staircase destructor";}
};
//main.cpp//
#include "HardwareDiagnostic.h"
using namespace std;
int main() {
std::unique_ptr<HardwareDiagnostic> algodiagnostic (new Staircase());
return 0;
}
最佳答案
当编译器处理 main.cpp 时,它会看到 Staricase 的用法,但看不到 Staircase 类的声明,因此会引发错误。您的 main.cpp 文件包含标题,它仅描述 HardwareDiagnostic 类,但未提供 Staircase 的信息。
好的做法是将类声明保存在头文件中,而不是 cpp 文件中,这样任何其他源都可以包含头文件并开始使用描述的类。也可以在头文件中包含普通类方法的定义(如 getters/setters),但是复杂的方法应该在头文件中声明并在相应的 cpp 文件中定义。
在您的情况下,我会执行以下操作:
- HardwareDiagnostic.h 描述了
HardwareDiagnostic
类。此文件中没有using std
行,因此包含此文件的任何人都不会隐式开始使用不需要的 namespace 。所有方法都已声明,但未定义。 - HardwareDiagnostic.cpp 定义了
HardwareDiagnostic
类的方法。所以有using std
行和所有方法的定义。 - Localization.h 包括 HardwareDiagnostic.h 并描述了
Localization
类。随着项目的增长,每个类都有单独的文件变得非常方便。 - Localization.cpp 定义了
Localization
类的方法。 - Staircase.h 和 Staircase.cpp 的构建方式与本地化相同。
- main.cpp 包括 HardwareDiagnostic.h 和 Staircase.h
关于c++ - 在 C++ 中使用 unique_ptr 出错之前预期的类型说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44573831/