分类: C/C++
2011-08-25 10:23:19
////////////main.h//////////////
#include "stdafx.h"
#include "man.h"
int main(){
Man m;
return 0;
}
////////////Person.h/////////////
#pragma once
class Person
{
public:
Person(void);
~Person(void);
};
////////Person.cpp///////////
#include "StdAfx.h"
#include ".\person.h"
Person:erson(void){
}
Person::~Person(void){
}
/////////Man.h///////////
#pragma once
#include "person.h"
class Man : public Person
{
public:
Man(void);
~Man(void);
private:
Person child;
};
/////////////Man.cpp//////////////
#include "StdAfx.h"
#include ".\man.h"
Man::Man(void){
}
Man::~Man(void){
}
/////////Man.h/////////// #pragma once //#include "person.h" //去掉 class Man : public Person { public: Man(void); ~Man(void); private: Person child; }; |
/////////Man.h/////////// #pragma once //#include "person.h" //去掉 class Person; //加入 class Man:public Person { public: Man(void); ~Man(void); private: Person child; }; |
error C2504: “Person” : 未定义基类 |
error C2504: “Person” : 未定义基类 |
/////////Man.h/////////// #pragma once //#include "person.h" //去掉 class Person; //加入 class Man:public Person { public: Man(void); ~Man(void); private: Person *child; //改为指针 }; |
/////////Man.h/////////// #pragma once //#include "person.h" //去掉 class Person; //加入 class Man //去掉erson { public: Man(void); ~Man(void); private: Person *child; //改为指针 }; |
error C2504: “Person” : 未定义基类 |
编译通过 |
int main()
{
int x;
Person p;//用C++时编译不通过;
}
对Java等语言对此问题的解法是,当程序定义出一个对象时,只配置足够空间给一个“指向该对象的指针”使用,如
public Person;
public static void main(String[] args)
{
Person p;
}class Person;
int main()
{
Person *p;//编译器当要配置一个指针大小的空间的指针给p就可以了。
//Person &p2; 这个理论上也可以,但references object必须“言之有物”
return 0;
}/////////Man.h///////////
#pragma once
#include "person.h"
class Man : public Person
{
public:
Man(void);
~Man(void);
private:
Person child;
};
////////////Person.h///////////// #pragma once class Person { public: Person(void); ~Person(void); virtual void addChild(Person p) = 0;//将Person变为抽象类 }; |
/////////Man.h/////////// #pragma once //#include "person.h" //去掉 class Person; //加入 class Man //去掉erson { public: Man(void); ~Man(void); private: Person *child; void addChild(Person p);//相应地在Man.cpp中加上这个空函数 }; |
error C2259: “Person” : 不能实例化抽象类 | |
/////////Man.h/////////// #pragma once #include "person.h" //加回来 class Person; //加不加入也没所谓 class Man //去掉erson { public: Man(void); ~Man(void); private: Person *child; void addChild(Person p);//相应地在Man.cpp中加上这个空函数 }; |
/////////Man.h/////////// #pragma once #include "person.h" //加回来 class Person; //加不加入也没所谓 class Man //去掉erson { public: Man(void); ~Man(void); private: Person *child; void addChild(Person *p);//将形参变为Person* }; |
error C2259: “Person” : 不能实例化抽象类 |
编译成功 |
/////////Man.h/////////// #pragma once #include "person.h" //加回来 class Person; //加不加入也没所谓 class Man //去掉erson { public: Man(void); ~Man(void); private: Person *child; void addChild(Person &p);//将形参变为Person& }; |
|
编译成功 |