在.h文件中转发声明以使用友好类

时间:2017-09-06 14:08:55

标签: c++ linked-list forward-declaration

template <typename T>
class linked;

template <typename T>
class node {
    ...
    friend class linked<T>; 
};

template <typename T>
class linked {
    ...
};

请注意,我已向前声明了链接类,以便将其声明为友好的节点类,但现在我想为每个类创建一个不同的.h和.cpp文件。我将如何在其中进行前瞻性声明。

2 个答案:

答案 0 :(得分:1)

node.hpp

#pragma once

template <typename T> class linked; 
template <typename T> class node { 
... 
friend class linked<T>; 
};

linked.hpp

#pragma once
#include "node.hpp" // just because I guess you will use it in linked implementation
template <typename T> class linked { 
... 
};

因此,您可以保留使用节点而不包含linked.hpp。您甚至可以将其保留为私有标头,但不会发送给用户。但如果链接某些代码想要使用链接类,只需包含linked.hpp。

修改 作为一种选择 node.hpp

#pragma once

template <typename T> class node { 
... 
class linked; 
friend class linked<T>; 
};

linked.hpp

#pragma once
#include "node.hpp"
template <typename T> class node<T>::linked { 
... 
};

答案 1 :(得分:0)

您应该考虑在.h文件中使用模板的完整声明。

如果你需要将它们分开,你可以:

linked.h:

template <typename T>
class linked;
#include "linked_implementation.tpp"

linked_implementation.tpp:

#ifndef LINKED_IMPLEMENTATION_TPP
#define LINKED_IMPLEMENTATION_TPP

template <typename T>
class node {
    ...
    friend class linked<T>; 
};

template <typename T>
class linked {
    ...
};

#endif

根据评论编辑