使用未定义类型'struct PelephonePH'无效

时间:2011-06-03 12:07:24

标签: c++

我收到了.cpp错误无效使用未定义的结构PelephonePN,CellcomPN等等 以及PelephonePN前向声明的误差。...

#ifndef PHONE_H_INCLUDED
#define PHONE_H_INCLUDED
#include <iostream>
#include <ctime>
#include <string>
#include "phone.h"

using namespace std;

class PhoneNumber;
class PelephonePN;
class CellcomPN;
class OrangePN;
class HotPN;
class BezeqPN;

class PhoneManager
{
private:
    PelephonePN* mpPelephone;
    CellcomPN* mpCellcom;
    OrangePN* mpOrange;
    HotPN* mpHot;
    BezeqPN* mpBezeq;
public:
    PhoneManager();
    ~PhoneManager();
    void split_check_data(string str);
};

#endif

和.cpp

#include <iostream>
#include <ctime>
#include <string>
#include <sstream>
#include "phone_manager.h"
#include "phone.h"


using namespace std;

PhoneManager::PhoneManager()
{
    srand(time(0));
    mpPelephone = new PelephonePN();
    mpCellcom = new CellcomPN();
    mpOrange = new OrangePN();
    mpHot = new HotPN();
    mpBezeq = new BezeqPN();
    mpPelephone->add(mpCellcom);
    mpPelephone->add(mpOrange);
    mpPelephone->add(mpHot);
    mpPelephone->add(mpBezeq);
    mpBezeq->setNext(mpPelephone);
}

5 个答案:

答案 0 :(得分:1)

要实例化一个对象,前向声明就不够了。在源文件中包含相应的标头。在构造函数的主体中,您将实例化mpPelephone, ....。因此,请确保在翻译单元中可以看到相应的类标题。

答案 1 :(得分:1)

.cpp源文件中,您需要#include定义class PelephonePN及其关联的标头。

如果你只是将它们用作指针或引用,那么在标题中转发声明这些class是很好的,但你可以使用开始在实现中,您需要为编译器提供定义

答案 2 :(得分:0)

您不能使用类的前向声明来访问其成员(包括构造函数,默认或其他)或其大小,如果没有这两件事,您就无法实例化该类的实例。

您需要完整的实现才能执行此操作,因此在.cpp文件中,您需要在整个class PelephonePN {/* class body */};部分中包含标题。

答案 3 :(得分:0)

在第一个文件中有行:

#ifndef PHONE_H_INCLUDED
#define PHONE_H_INCLUDED

我想你在phone.h中有相同的行,请检查......

答案 4 :(得分:0)

你的PelephonePN和合作伙伴吗?在特定的命名空间?如果是这样,预解释必须都在同一名称空间中。既然你添加了一个using namespace std(叹气),我的猜测是phone.h在命名空间std中定义你的类(我希望它没有,但那是另一回事)。 如果是这样,您的预先声明必须是:     namespace std {         PelephonePN类;     }

不过,什么是pelephone ??? O.O