我正在尝试为我的一个项目开发抽象设计模式代码,如下所示..但是,我无法编译代码..一些编译错误(如“未解析的外部符号”public:virtual void __thiscall Xsecs :: draw_lines(double,double)“(?draw_lines @ Xsecs @@ UAEXNN @ Z)”)..任何人都可以帮助我...
#include "stdafx.h"
#include <iostream>
#include <vector>
#include "Xsecs.h"
using namespace std;
//Product class
class Xsecs
{
public:
virtual void draw_lines(double pt1, double pt2);
virtual void draw_curves(double pt1, double rad);
};
class polyline: public Xsecs
{
public:
virtual void draw_lines(double pt1,double pt2)
{
cout<<"draw_line in polygon"<<endl;
}
virtual void draw_curves(double pt1, double rad)
{
cout<<"Draw_curve in circle"<<endl;
}
/*void create_polygons()
{
cout<<"create_polygon_thru_draw_lines"<<endl;
}*/
};
class circle: public Xsecs
{
public:
virtual void draw_lines(double pt1,double pt2)
{
cout<<"draw_line in polygon"<<endl;
}
virtual void draw_curves(double pt1, double rad)
{
cout<<"Draw_curve in circle"<<endl;
}
/*void create_circles()
{
cout<<"Create circle"<<endl;
}*/
};
//Factory class
class Factory
{
public:
virtual polyline* create_polyline()=0;
virtual circle* create_circle()=0;
};
class Factory1: public Factory
{
public:
polyline* create_polyline()
{
return new polyline();
}
circle* create_circle()
{
return new circle();
}
};
class Factory2: public Factory
{
public:
circle* create_circle()
{
return new circle();
}
polyline* create_polyline()
{
return new polyline();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Factory1 f1;
Factory * fp=&f1;
return 0;
}
答案 0 :(得分:6)
我认为您正在尝试创建虚拟基类。你需要在类Xsecs中的draw_lines和draw_curves方法的末尾添加'= 0'
class Xsecs
{
public:
virtual void draw_lines(double pt1, double pt2) = 0;
virtual void draw_curves(double pt1, double rad) = 0;
};
编译器抱怨,因为您没有对相关方法进行任何实现。
答案 1 :(得分:2)
您应该从A
公开继承,例如
class ProductA1 : public ProductA {
...
如果没有public
关键字,则此关系为私有继承,这不是 is-a 关系,因此您无法简单地从{ {1}}至ProductA1
。
Scott Meyers在Effective C++, Third Ed.第39项中解释了这一点:
帖子第二版的[...]编译器,当给定一个类
ProductA
公开继承自类Student
的层次结构时,隐式地将学生转换为人,这是函数调用成功所必需的。[...]管理您刚才看到的私有继承的第一条规则:与公共继承相反,编译器通常不会将派生类对象(例如
Person
)转换为基类对象(如Student
)如果类之间的继承关系是私有的。 [...]第二条规则是从私有基类继承的成员成为派生类的私有成员,即使它们在基类中受到保护或公开。私有继承意味着是以的方式实现的。如果您将某个类
Person
私有地从类D
继承,那么您这样做是因为您有兴趣利用类B
中提供的某些功能,而不是因为有任何功能类型B
和B
的对象之间的概念关系。因此,私有继承纯粹是一种实现技术。
更新:如果你想要纯虚函数,你应该声明它们:
D
否则链接器将错过他们的定义。
答案 2 :(得分:1)
在所有类定义中,您忘记使用public关键字:
class ProductA1 : ProductA
应该是
class ProductA1 : public ProductA
等等
答案 3 :(得分:1)
您需要为Xsecs :: draw_lines / Xsecs :: draw_curves添加一个实现,或者通过在其定义中附加“= 0”将它们定义为纯虚拟。
class Xsecs
{
public:
virtual void draw_lines(double pt1, double pt2)
{
// Do something
}
virtual void draw_curves(double pt1, double rad)
{
// Do something
}
};
或者...
class Xsecs
{
public:
virtual void draw_lines(double pt1, double pt2) = 0;
virtual void draw_curves(double pt1, double rad) = 0;
};
答案 4 :(得分:-1)
将“class”更改为“struct”,这使得默认的公共继承而不是私有