类中未声明的字符串标识符
Posted
技术标签:
【中文标题】类中未声明的字符串标识符【英文标题】:string undeclared identifier in class 【发布时间】:2019-01-02 06:33:07 【问题描述】:我正在学习 c++ 继承,这里我遇到了问题。 如果我将这个简单的代码全部放在 main.cpp 文件中,它将无需任何 问题。
但是当我将头文件和其他文件分开时 它不起作用,它给了我一些错误。
这是名为book.h的头文件的代码
#ifndef BOOK_H
#define BOOK_H
class book
private:
string name;
public:
book(string n = "default") : name(n) ;
~book() ;
void printname();
;
#endif
这里是 book.cpp 的代码,我定义了这个类的函数 在这个文件中。
#include <iostream>
#include <Windows.h>
#include <string>
#include "book.h"
using namespace std;
void book::printname()
cout << name << endl;
return;
最后是 main.cpp 文件:
#include <iostream>
#include <Windows.h>
#include <string>
#include "book.h"
using namespace std;
int main()
system("color 0A");
book programing("c++");
cout << "the name of the book is ";
programing.printname();
system("pause");
return;
以及我得到的错误:
严重性代码描述项目文件行抑制状态
错误 C2065 'name': 未声明的标识符 book d:\vs 程序\书籍\书籍\书籍.cpp 10
错误 C3646 'name': 未知的覆盖说明符 book d:\vs 程序\书籍\书籍\书籍.h 7
错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 没有 支持default-int book d:\vs program\book\book\book.h 7
错误 C2061 语法错误:标识符 'string' book d:\vs 程序\书籍\书籍\书籍.h 10
错误 C2065 'n': 未声明的标识符 book d:\vs 程序\书籍\书籍\书籍.h 10
错误 C2614 'book':非法成员初始化:'name' 不是 基础或成员书 d:\vs program\book\book\book.h 10
错误 C3646 'name': 未知的覆盖说明符 book d:\vs 程序\书籍\书籍\书籍.h 7
错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 没有 支持 default-int book d:\vs program\book\book\book.h 7 错误 C2061 语法错误:标识符 'string' book d:\vs 程序\书籍\书籍\书籍.h 10
错误 C2065 'n': 未声明的标识符 book d:\vs 程序\书籍\书籍\书籍.h 10
错误 C2614 'book':非法成员初始化:'name' 不是 基础或成员书 d:\vs program\book\book\book.h 10
还有其他错误...
【问题讨论】:
【参考方案1】:您需要确保 string
是 .h 文件中的有效类型。
-
添加
#include <string>
。
使用std::string
而不仅仅是string
。
#ifndef BOOK_H
#define BOOK_H
#include <string>
class book
private:
std::string name;
public:
book(std::string n = "default") : name(n) ;
~book() ;
void printname();
;
#endif
【讨论】:
【参考方案2】:This answer 似乎可以解决您的问题。 附带说明一下,从 C++11 开始,您还可以为类成员指定默认值。所以你可以这样做:
#ifndef BOOK_H
#define BOOK_H
#include <string>
class book
private:
std::string name = "default";
public:
book() = default;
book(std::string n) : name(n) ;
~book() ;
void printname();
;
#endif
【讨论】:
在此代码中,将永远不会使用默认值,因为您没有默认构造函数(并且提供的构造函数会替换它) 我喜欢这个补充,但是你没有解释实际问题在哪里 需要添加默认构造函数:book() = default;
以上是关于类中未声明的字符串标识符的主要内容,如果未能解决你的问题,请参考以下文章
RestKit - RKObjectManager 中未声明的标识符“DISPATCH_QUEUE_SERIAL”?