作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道我们应该尽可能使用前向声明而不是 include 来加快编译速度。
我有一个类Person
像这样。
#pragma once
#include <string>
class Person
{
public:
Person(std::string name, int age);
std::string GetName(void) const;
int GetAge(void) const;
private:
std::string _name;
int _age;
};
和一个类 Student
像这样
#pragma once
#include <string>
class Person;
class Student
{
public:
Student(std::string name, int age, int level = 0);
Student(const Person& person);
std::string GetName(void) const;
int GetAge(void) const;
int GetLevel(void) const;
private:
std::string _name;
int _age;
int _level;
};
在 Student.h 中,我有一个前向声明 class Person;
使用 Person
在我的转换构造函数中。美好的。但是我做了#include <string>
在使用 std::string
时避免编译错误在代码中。如何在这里使用前向声明来避免编译错误?可能吗?
谢谢。
最佳答案
自用string
作为
std::string _name;
//^^^^^^^^^ concrete member
string
的整体结构将需要,因此必须需要声明。你必须 #include <string>
.
声明string
可以省略,如果你写,例如
std::string* _name;
//^^^^^^^^^^ pointer or reference
您可以使用前向声明,但我仍然建议您不要这样做,因为std::string
不是像 Person 或 Student 这样的简单结构类型,而是涉及很多模板的非常复杂的类型:
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
class basic_string { ... };
typedef basic_string<char> string;
如果你错误地转发声明它(例如 class string;
),当你实际使用它时编译会因为类型冲突而失败。
关于c++ - 对内置数据类型使用前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2989125/
我是一名优秀的程序员,十分优秀!