如何在某些头文件(嵌套类)的 cpp 文件中包含我的实现

Posted

技术标签:

【中文标题】如何在某些头文件(嵌套类)的 cpp 文件中包含我的实现【英文标题】:How to include my implementation in cpp file for some header file (nested classes) 【发布时间】:2014-05-17 16:40:33 【问题描述】:

我在尝试整理项目文件 C++ 时遇到问题

我只是在设计一个特定的模板类 Mystackt,我想将整个类包含在 Mystackt 的公共部分中作为迭代器类 MyIterator; 我在我的头文件 MyTemplate.h 中写了所有这些东西 简而言之,它会显示如下

template <class Type> /* that's in file **MyTemplate.h** */
class MyStackt

friend somefunction (int,string,bool);
public:

class iterator

public:
iterator();
void somefunc(param1,param2.....);
void otherfunc(...);
private:
Type* ptr;
;

int public_func_of_stackt(void);
void an-otherfunc(int,string,Type,...etc);
private:
int x;
string y;Type* val;
;

现在让我们看看这个头文件 MyTemplate.cpp 的 cpp 文件 我可以毫无问题地包含 Mytemplate 类的所有成员函数的代码 例如:

template <class Type>
int MyStack<Type>::public_func_of_stackt(void)  /*this works perfect*/
implementation goes here ...;     

但是当我尝试编写整个类(迭代器类)的成员函数的实现时,问题就开始了

template <class Type>
bool MyStackt<Type>::iterator somefunc(param1,param2.....)
 return current ==rhs.current; 

先生们的问题是: 如何在 Mytemplate.cpp 文件中包含我的类迭代器成员函数的代码?我应该如何使用该 external::entire 或其他特定符号来编写它? 其他问题: 我如何(在 Mytemplate.cpp 文件中)编写 MyStackt 类的友元函数的实现??

更新#1:谢谢 Veritas

但我还需要知道如何定义 MyStackt 类的一些公共函数 如果该函数返回迭代器类型(所以它返回整个类的对象)

定义看起来像这样

template <class Type>
iterator Stackt<Type>::begin()
 return *this;    /*this function did not work*/

也许我需要使用一些特定的符号 4 吗?如果我有多个嵌套类怎么办 等待专家的答复 提前谢谢你!

【问题讨论】:

如果你想检查我的编辑。 模板 MyStackt 类和迭代器类很大,它们有多个构造函数和函数 我将一些代码移动到单独的文件中,这样以后维护它们会更容易 MyStackt 的返回迭代器的函数当我在 MyStackt 范围内编写他们的代码时,对象工作得很好 - 正如你所提到的,但是当我试图将此代码移动到 cpp 和 .h 文件模板 迭代器 Stackt 时,这种代码出现了问题::begin() 返回 *this;我尝试了 MyStackt::iterator 表示法,它不起作用我得到一个语法错误 它是模板 MyStackt::iterator MyStackt::begin() ... 但返回 *this 意味着您返回 MyStackt 对象,我认为这不是您想要做的。如果您打算写“返回 this”,那仍然是错误的,因为您希望将迭代器返回到 MyStackt 对象处理的数组中的第一个元素,而不是指向实际 MyStackt 对象的指针。 【参考方案1】:

您在定义 somefunc 时忘记了范围解析运算符。定义应该是:

template <class Type>
bool MyStackt<Type>::iterator::somefunc(param1,param2.....)
 
    return current == rhs.current; 

至于友元函数,您可以像定义任何其他全局函数一样定义它。

您的编辑:

迭代器类属于 MyStackt 的作用域,因此当您需要在 MyStackt 之外提及它时,您需要使用作用域运算符。至于您的问题,我不确定您要做什么。 *this 返回 MyStackt 类型的实例化对象。

还要小心!如果您想分开您的定义,请使用 .inl 文件或类似文件,而不是在 cpp 文件中。

【讨论】:

以上是关于如何在某些头文件(嵌套类)的 cpp 文件中包含我的实现的主要内容,如果未能解决你的问题,请参考以下文章

GCC 和预编译头文件

正确包含标题

“配置”脚本如何检测我的系统是不是支持某些头文件或 cpp 功能?

使用头文件编译 C++ 程序时出错:体系结构 x86_64 的未定义符号

C++ 头文件约定

在 vue cli3 项目中包含我自己的 js 和 css 文件