如何解决 "Does not name a type" 错误
How to solve "Does not name a type" error
我收到以下错误:
'class name' does not name a type
我所有的 classes。
我怀疑这可能是循环依赖,但我不知道如何解决它,因为每个 class 都需要访问下一个函数。以下是我的 classes:
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;
}
提前感谢您的帮助。
这确实是你们header之间的循环依赖。 Container.h
包括Factory.h
,其中包括Iterator.h
,其中包括Container.h
。
解决方案是将成员函数的实现从 header 文件移动到源文件中。这样,header 文件将只需要 类 的声明,而不是定义,您可以轻松地将其直接放入 "consuming" header 文件中:
class Iterator;
class Container
{
public:
Container();
Iterator* createIterator();
friend class Iterator;
private:
int* array;
};
然后,在适当的源文件(例如Container.cpp
)中,实现成员函数并包含您需要的任何header:
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();
}
(当然是 Factory
和 Iterator
的 Dtto)。
在构建最终二进制文件时不要忘记 link 所有源文件。
我收到以下错误:
'class name' does not name a type
我所有的 classes。
我怀疑这可能是循环依赖,但我不知道如何解决它,因为每个 class 都需要访问下一个函数。以下是我的 classes:
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;
}
提前感谢您的帮助。
这确实是你们header之间的循环依赖。 Container.h
包括Factory.h
,其中包括Iterator.h
,其中包括Container.h
。
解决方案是将成员函数的实现从 header 文件移动到源文件中。这样,header 文件将只需要 类 的声明,而不是定义,您可以轻松地将其直接放入 "consuming" header 文件中:
class Iterator;
class Container
{
public:
Container();
Iterator* createIterator();
friend class Iterator;
private:
int* array;
};
然后,在适当的源文件(例如Container.cpp
)中,实现成员函数并包含您需要的任何header:
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();
}
(当然是 Factory
和 Iterator
的 Dtto)。
在构建最终二进制文件时不要忘记 link 所有源文件。