当我将代码分离到头文件 [duplicate] 时出现问题

problem when I separate code to header file [duplicate]

提问人:asipoolika 提问时间:3/13/2021 最后编辑:Vlad from Moscowasipoolika 更新时间:3/13/2021 访问量:92

问:

该程序可以正常工作,但是当我将“Class StudentsName”分开并将其放在头文件中时,它无法正常工作。我通过右键单击标题文件夹并选择新项目和选择标题来在我的项目中添加头文件,但它无法正常工作。

主文件:

#include "iostream"
#include "string"
#include "Students.h"
using namespace std;

int main()
{
    string nameOfStudent;
    StudentsName myStudentsName(" The student name is: Jason");
    cout<<myStudentsName.getMyName()<<endl;

    cout<<"please enter the name of the student: "<<endl;
    getline(cin, nameOfStudent);
    myStudentsName.setMyName(nameOfStudent);
    cout<<endl;

    myStudentsName.displayMyName();

    system("pause");
    return 0;
}

头文件 (Students.h):

class StudentsName
{
public:
    StudentsName (string  stdName)
    {
        setMyName(stdName);
    }
    void setMyName(string stdName)
    {
        myName=stdName;
    }
    string getMyName ()
    {
        return myName;
    }
    void displayMyName()
    {
        cout<<"The student name is: "<<getMyName()<<endl;
    }

private:
     string myName;
};

错误:

students.h(5): error C2061: syntax error : identifier 'string'
students.h(9): error C2061: syntax error : identifier 'string'
students.h(13): error C2146: syntax error : missing ';' before identifier 'getMyName'
students.h(13): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
students.h(14): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
students.h(16): warning C4183: 'getMyName': missing return type; assumed to be a member function returning 'int'
students.h(23): error C2146: syntax error : missing ';' before identifier 'myName'
students.h(23): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
students.h(7): error C2065: 'stdName' : undeclared identifier
students.h(11): error C2065: 'myName' : undeclared identifier
students.h(11): error C2065: 'stdName' : undeclared identifier
students.h(15): error C2065: 'myName' : undeclared identifier
students.h(19): error C2065: 'cout' : undeclared identifier
students.h(19): error C2065: 'endl' : undeclared identifier
studentname.cpp(11): error C2664: 'StudentsName::StudentsName(const StudentsName &)' : cannot convert parameter 1 from 'const char [84]' to 'const StudentsName &'
1>          Reason: cannot convert from 'const char [84]' to 'const StudentsName'
1>          No constructor could take the source type, or constructor overload resolution was ambiguous
studentname.cpp(16): error C2660: 'StudentsName::setMyName' : function does not take 1 arguments
C++ 头文件 名称查找 using 指令

评论


答:

2赞 Vlad from Moscow 3/13/2021 #1

using 指令

using namespace std;

放在包含标头之后"Student.h"

#include "iostream"
#include "string"
#include "Students.h"
using namespace std;

因此,名称在标头中未定义。string"Students.h"

将指令放在包含标头之前。

#include "iostream"
#include "string"
using namespace std;
#include "Students.h"

尽管最好在标头中包含标头和标头并使用 .<string><iostream>"Students.h"std::string

评论

0赞 IWonderWhatThisAPIDoes 3/13/2021
真的没有更好的方法吗?比如,包括实际使用它们的标题?这只会使标头不可移植
2赞 sweenish 3/13/2021
提供一个不鼓励这种做法的答案不是更好吗?头文件不包括它使用的内容,这确实是问题所在。
0赞 Vlad from Moscow 3/13/2021
@sweenish 正如你所说,“这种做法”实际上在所有针对初学者的书籍中都使用过。因此,当他阅读这样一本书时,指出 using 指令必须放置在哪里就足够了。
0赞 sweenish 3/13/2021
至少,我会不解决它,并解决仅包含在标题中的实际问题。你是在看我的历史还是什么?我确信我已经说过了,但这也不等同于我提倡它,当然不是现在。<string>
0赞 πάντα ῥεῖ 3/13/2021
@Vlad我希望你不介意我欺骗了这个问题。