c++ - 在 C++ 中使用 unique_ptr 出错之前预期的类型说明符

标签 c++ pointers unique

在下面的代码中,编译时出现错误, 错误 : ma​​in.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.hStaircase.cpp 的构建方式与本地化相同。
  • ma​​in.cpp 包括 HardwareDiagnostic.hStaircase.h

关于c++ - 在 C++ 中使用 unique_ptr 出错之前预期的类型说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44573831/

相关文章:

c - 为什么我可以更改 const char *ptr 的内容?

c++ - 使用 OpenGL 在 C++ 中绘制 8 x 15 矩形网格 - 崩溃

pointers - unique_ptr 的意义何在?

javascript - jQuery 'unique' 在 Safari 中不返回实际的唯一值

R:在向量列表中查找唯一向量

c++ - 特征值:t 为 1s 的随机二元 vector

c++ - 使用 var_arg 为函数调用传递参数

javascript - 从逗号分隔的字符串中删除重复项

c++ - 无法通过 "undefined reference to ` XXXX'”

c++ - typedef 枚举不工作 C++