实现文件无法从 C++ 头文件中识别类名 [重复]

Posted

技术标签:

【中文标题】实现文件无法从 C++ 头文件中识别类名 [重复]【英文标题】:Implementation file unable to identify class name from C++ Header file [duplicate] 【发布时间】:2016-12-23 09:20:46 【问题描述】:

我正在学习 C++。我正在练习将我的 C++ 类拆分为单独的文件——实现和头文件,即 Student_Impl.cppStudent_Header.h。然后有一个驱动文件 Student_register.cpp 将创建 3 个学生对象。但是,当我尝试构建它时,它会抛出错误,说明 Student 不是命名空间或类。我在我的实现文件 Student_Impl.cpp 和驱动程序文件 Student_register.cpp 中包含了 Student_Header.h(存在 Student 类声明),但它仍然抛出相同的错误。可能的原因是什么?我正在使用 Visual Studio 2015。

Student_Header.h

#pragma once
#include <string>
using namespace std;

class Student 
private:
    string fname;
    string lname;
    string address;
    string city;
    string phone;
    int age;

public:
    Student();
    Student(string, string, string, string, string, int);
    ~Student();
    string get_fname();
    string get_lname();
    string get_address();
    string get_city();
    string get_phone();
    int get_age();
;

Student_Impl.cpp

    #include "Student_Header.h"
    #include "iostream"
    #include "stdafx.h"
    #include <string>
    using namespace std;

    Student::Student()
    

    

    Student::Student(string fname1, string lname1, string address1, string city1, string phone1, int age1)
    
        fname = fname1;
        lname = lname1;
        address = address1;
        city = city1;
        phone = phone1;
        age = age1;
    

    string Student::get_fname()
    
        return fname;
    

    string Student::get_lname()
    
        return lname;
    

    string Student::get_address()
    
        return address;
    

    string Student::get_city()
    
        return city;
    

    string Student::get_phone()
    
        return phone;
    

    int Student::get_age()
    
        return age;
    


    Student::~Student()
    

Student_register.cpp

#include "stdafx.h"
#include "Student_Header.h"
#include <string>
#include "iostream"
using namespace std;

int main()

    Student Student1("Mike", "J", "MikeAdd", "MikeCity", "MikePhone", 26);
    Student Student2("Jack", "R", "JackAdd", "JackCity", "JackPhone", 25);
    Student Student3("Roney", "M", "RoneyAdd", "RoneyCity", "RoneyPhone", 27);

    // code for data retrieval

    return 0;

【问题讨论】:

是否包含正确的头文件?如果您在不同文件夹中有多个同名文件,编译器可能会选择错误的文件。要找出实际使用的文件,您可以为其中一个实现文件启用“显示包含”选项。此选项曾经位于文件属性 IIRC 的“C++”-“高级”部分中。 @MarvinSielenkemper 是的,Student_Header.h 是正确的头文件。这是唯一具有该名称的文件。 您应该在“Student_Impl.cpp”中包含本地头文件“stdafx.h”之后。该文件是 VS 的预编译头机制的一部分,需要格外小心。 @MarvinSielenkemper 非常感谢。有效 :) 。我需要几天时间才能弄清楚这一点。感谢您的帮助。 禁用项目的预编译头文件实际上可能是个好主意,因为这应该只是在大型项目中使用的优化,但由于某种原因已将其纳入项目模板。 【参考方案1】:

Marvin Sielenkemper 将正确答案放在评论中 - 标题 prior 到 "stdafx.h" 被忽略。这是预编译头文件如何在 Visual Studio 上工作的特定于实现的副作用。

另外,使用#include &lt;iostream&gt; 代替#include "iostream"&lt;header&gt; 表单用于标准标题,"header.h" 用于您自己的标题。

【讨论】:

以上是关于实现文件无法从 C++ 头文件中识别类名 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++的纯虚函数实现和头文件

VScode 无法使用C++万能头文件#include<bits/stdc++.h> 解决方案

原理:C++为什么一般把模板实现放入头文件

Linux - 从不同位置编译 C++ 项目文件 [重复]

C++进阶之路C++防止头文件被重复引入的3种方法!

C++函数通过头文件分享给其他源文件时,使用命名空间方式,和使用类中静态函数方式,有何区别?