目前,我正在我的书中学习C ++,他们进行了使用先前创建的名为IntList的类并使用IntListProxy进行实现的练习。我的书仅在一个非常简单的示例中讨论了代理,因此我很难理解它的语法。此代理我在做什么错,我该如何解决?请记住,IntList已经是一个.o,并且在编译时不允许包含IntList.cpp。
错误:

IntListProxy.cpp: In member function ‘bool IntListProxy::isEmpty()’:
IntListProxy.cpp:7: error: invalid use of incomplete type ‘struct IntList’
IntListProxy.h:5: error: forward declaration of ‘struct IntList’
IntListProxy.cpp: In member function ‘IntListProxy* IntListProxy::prepend(int)’:
IntListProxy.cpp:13: error: invalid use of incomplete type ‘struct IntList’
IntListProxy.h:5: error: forward declaration of ‘struct IntList’
IntListProxy.cpp: In member function ‘int IntListProxy::head()’:
IntListProxy.cpp:19: error: invalid use of incomplete type ‘struct IntList’
IntListProxy.h:5: error: forward declaration of ‘struct IntList’
IntListProxy.cpp: In member function ‘IntListProxy* IntListProxy::tail()’:
IntListProxy.cpp:25: error: invalid use of incomplete type ‘struct IntList’
IntListProxy.h:5: error: forward declaration of ‘struct IntList’
IntListProxy.cpp: In member function ‘std::string IntListProxy::toString()’:
IntListProxy.cpp:31: error: invalid use of incomplete type ‘struct IntList’
IntListProxy.h:5: error: forward declaration of ‘struct IntList’
IntListProxy.cpp: In member function ‘int IntListProxy::length()’:
IntListProxy.cpp:37: error: invalid use of incomplete type ‘struct IntList’
IntListProxy.h:5: error: forward declaration of ‘struct IntList’
IntListProxy.cpp: In member function ‘IntListProxy*       `IntListProxy::append(IntListProxy*)’:`
IntListProxy.cpp:43: error: invalid use of incomplete type ‘struct IntList’
IntListProxy.h:5: error: forward declaration of ‘struct IntList’
IntListProxy.cpp: In member function ‘int IntListProxy::operator[](int)’:
IntListProxy.cpp:49: error: invalid use of incomplete type ‘struct IntList’
IntListProxy.h:5: error: forward declaration of ‘struct IntList’
IntListProxy.cpp:51: error: expected unqualified-id before ‘}’ token
IntListProxy.cpp:51: error: expected ‘;’ before ‘}’ token


IntListProxy.h

#include <iostream>
#include <string>

using namespace std;
class IntList;

class IntListProxy
{
 public:
  IntListProxy();
  bool isEmpty();
  IntListProxy *prepend(int n);
  int head();
  IntListProxy *tail();
  string toString();
  int length();
  IntListProxy *append(IntListProxy *lst);
  int operator[](int n);
 private:
  IntList *ptr;

};


IntListProxy.cpp

#include "IntListProxy.h"

IntListProxy::IntListProxy(){}

bool IntListProxy::isEmpty(){

  ptr->isEmpty();

}

IntListProxy *IntListProxy::prepend(int n){

  return ptr->prepend(n);

}

int IntListProxy::head(){

  return ptr->head();

}

IntListProxy *IntListProxy::tail(){

  return ptr->tail();

}

string IntListProxy::toString(){

  return ptr->toString();

}

int IntListProxy::length(){

  return ptr->length();

}

IntListProxy *IntListProxy::append(IntListProxy *lst){

  return ptr->append(lst);

}

int IntListProxy::operator[](int n){

  return ptr->operator[](n);

}


先感谢您!

最佳答案

建议的解决方案:
您需要在cpp文件IntList中包含定义类IntListProxy.cpp的头文件。

说明:
在不添加头文件的情况下,添加以下行:

class IntList;


它正向声明了类IntList,对于编译器来说,这是一个不完整的类型。对于不完整类型,无法创建其对象或执行任何需要编译器知道IntList布局的事情,或者做不到比IntList只是类型这一事实更多的事情。即:编译器不知道其成员和内存布局是什么。
但是,由于指向所有对象的指针只需要相同的内存分配,因此当仅将Incomplete类型用作指针时,可以使用前向声明。

在这种情况下,您的cpp文件IntListProxy.cpp需要知道IntList的布局(成员),才能取消引用它,从而导致错误。

10-08 11:12