加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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).

在构建最终二进制文件时,不要忘记将所有源文件链接在一起.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读