ife*_*lse 5 c++ syntax class forward-declaration
我遇到以下错误-当我只先提供类的定义,然后再声明时。我的理解是,只要我们这样做,就像我为函数定义所做的很多次一样,编译器就可以理解,但是似乎我的理解是有缺陷的,有人可以帮助我理解理解如何声明类的过程中缺少的部分。
error C2027: use of undefined type 'generic_iterator'
note: see declaration of 'generic_iterator
Run Code Online (Sandbox Code Playgroud)
不起作用 -上面显示的错误
#include <iostream>
class generic_iterator;
class darray
{
public:
typedef generic_iterator iterator;
darray();
darray(int size);
~darray();
int& at(int index);
int& operator [](int i);
int* data(void);
bool empty();
void fill(int val);
void print();
size_t max_size();
iterator begin() {return iterator(ptrarray); }
iterator end() { return iterator(ptrarray + size); }
private:
int *ptrarray;
int num_elements;
int size;
};
class generic_iterator
{
public:
generic_iterator(int *ptr);
~generic_iterator();
generic_iterator& operator++(); // pre-increment
generic_iterator operator++(int); // post-increment
private:
int *iptr;
};
Run Code Online (Sandbox Code Playgroud)
Works:第一次宣布整个班级时
class generic_iterator
{
public:
generic_iterator(int *ptr);
~generic_iterator();
generic_iterator& operator++(); // pre-increment
generic_iterator operator++(int); // post-increment
private:
int *iptr;
};
class darray
{
public:
typedef generic_iterator iterator;
darray();
darray(int size);
~darray();
int& at(int index);
int& operator [](int i);
int* data(void);
bool empty();
void fill(int val);
void print();
size_t max_size();
iterator begin() {return iterator(ptrarray); }
iterator end() { return iterator(ptrarray + size); }
private:
int *ptrarray;
int num_elements;
int size;
};
Run Code Online (Sandbox Code Playgroud)
当您在使用前声明某事物的摘要时,这称为前向声明。
在对函数进行前向声明时,编译器具有解析调用该函数的代码所需的一切:函数的名称,返回的类型,参数的数量以及每个参数的类型。
但是,在对类进行前向声明时,编译器仅知道该特定符号(generic_iterator
在您的情况下)是类。随后,在对其进行完全定义之前,您唯一可以做的就是声明一个指向它的指针。(而且比我更了解C ++的人们可能会知道一两个额外的奥术用法。)您不能调用其任何成员,因为编译器尚不知道其结构。您的代码正在尝试调用前向引用类的构造函数,但编译器尚不知道任何此类构造函数。
我不知道有任何简单的方法可以解决此问题。其他人可能有一些更好的解决方案,但是我倾向于解决此问题的方法是将所有需要访问向前声明的类的成员的代码从.h
文件移到.cpp
文件中。因此,在您的情况下,.h
我将在文件中简单地编写iterator begin();
,然后在.cpp
文件中进行写入generic_iterator darray::begin() {return iterator(ptrarray); }
。
这将进行编译,因为此时generic_iterator
已知道的完整类定义。