c – 如何解决“不命名类型”错误
发布时间:2020-12-16 10:04:03 所属栏目:百科 来源:网络整理
导读:我收到以下错误: ‘class name’没有为我的所有类命名类型. 我怀疑它可能是循环依赖,但我不知道如何解决它,因为每个类都需要从下一个访问函数.以下是我的课程: Container.h: #ifndef CONTAINER_H#define CONTAINER_H#include "Factory.h"class Container{
我收到以下错误:
‘class name’没有为我的所有类命名类型. 我怀疑它可能是循环依赖,但我不知道如何解决它,因为每个类都需要从下一个访问函数.以下是我的课程: Container.h: #ifndef CONTAINER_H #define CONTAINER_H #include "Factory.h" class Container { public: Container() { array = new int[10]; for (int i = 0; i < 10; ++i) { array[i] = i; } } Iterator* createIterator() { Factory fac; return fac.factoryMethod(); } friend class Iterator; private: int* array; }; #endif //CONTAINER_H Factory.h: #ifndef FACTORY_H #define FACTORY_H #include "Iterator.h"; class Factory { Iterator* factoryMethod(Container* con) { return new Iterator(con); } }; #endif //FACTORY_H Iterator.h: #ifndef ITERATOR_H #define ITERATOR_H #include "Container.h" class Iterator { public: Iterator(Container* con) { this->con =con; } int getFromIndex(int i) { return con->array[i]; } private: Container* con; }; #endif //ITERATOR_H main.cpp中: #include <iostream> using namespace std; #include "Container.h" #include "Iterator.h" int main() { Container con; Iterator* it = con.createIterator(); cout<<it->getFromIndex(2)<<endl; return 0; } 预先感谢您的任何帮助. 解决方法
它确实是标题之间的循环依赖. Container.h包括Factory.h,其中包括Iterator.h,其中包含Container.h.
解决方案是将成员函数的实现从头文件移动到源文件中.这样,头文件只需要类的声明而不是定义,您可以直接将它们直接放在“使用”头文件中: class Iterator; class Container { public: Container(); Iterator* createIterator(); friend class Iterator; private: int* array; }; 然后,在适当的源文件(例如Container.cpp)中,实现成员函数并包含您需要的任何头文件: Container.cpp #include "Container.h" #include "Factory.h" Container::Container() : array(new int[10]) { for (int i = 0; i < 10; ++i) { array[i] = i; } } Iterator* Container::createIterator() { Factory fac; return fac.factoryMethod(); } (当然,Dtto for Factory and Iterator). 在构建最终二进制文件时,不要忘记将所有源文件链接在一起. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |