代理语法错误:我做错了什么?

时间:2011-10-31 17:54:14

标签: c++ proxy

目前我在书中学习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);

}

提前谢谢!

3 个答案:

答案 0 :(得分:2)

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

<强>解释
而不是包括头文件,你添加行:

class IntList;

It Forward声明了类IntList,这对于编译器来说意味着它是 不完整类型 。对于不完整的类型,无法创建它的对象或执行任何需要编译器知道IntList的布局或更多IntList只是一种类型的事实。即:编译器不知道它的成员是什么以及它的内存布局是什么。 但由于指向所有对象的指针只需要相同的内存分配,因此只需将不完整类型作为指针进行处理即可使用前向声明。

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

答案 1 :(得分:0)

在第7行,您致电isEmptyIntList仅向前宣布。编译器还没有看到类的实际定义。

答案 2 :(得分:0)

您刚刚转发声明IntList。编译器不知道此struct中存在哪些方法。因此,您需要在代理cpp文件中包含包含IntList定义的头文件。