2010-04-24 91 views
4

我想为我的项目之一开发抽象设计模式代码如下..但是,我无法编译代码..给一些编译错误(如“未解析的外部符号 “市民:虚拟无效__thiscall Xsecs :: draw_lines(双,双)”(?draw_lines @ Xsecs @@ UAEXNN @ Z)”)..任何一个可以帮我在这...无法解析的外部符号链接器错误(C++)

#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; 
} 
+1

@Niranjan:如果你有一个后续问题,请**编辑**你原来的问题或要求一个新的。不要替换你的旧问题。由于答案不再符合问题,这使得它非常混乱。 – 2010-04-24 13:45:19

回答

1

在你所有的类定义你忘了使用公共关键字:

class ProductA1 : ProductA 

应该

class ProductA1 : public ProductA 

2

你应该从A公开继承,像

class ProductA1 : public ProductA { 
... 

没有public关键字,这种关系是私有继承,这是不是一个是,一个关系,因此你不能简单地从ProductA1投到ProductA

斯科特迈尔斯解释这Effective C++, Third Ed.,第39项:

[...]编译器,给其中一类Student公开从一个类继承Person一个层次的时候,隐含学生转换成的人时是函数调用成功所必需的。

第一条规则是管理您刚才看到的私有继承:与公共继承相比,编译器通常不会将派生类对象(如Student)转换为基类对象(例如如Person),如果类之间的继承关系是私有的。 [...]第二条规则是,从私有基类继承的成员成为派生类的私有成员,即使它们在基类中受到保护或公开。

私有继承意味着中实现。如果您创建一个类D私人继承类B,您这样做是因为您有兴趣利用类B中的某些功能,而不是因为BD类型的对象之间存在任何概念关系。因此,私有继承纯粹是一种实现技术。

为后的第二个版本更新:如果你想纯虚函数,你应声明它们这样:

virtual void draw_lines(double pt1, double pt2) = 0; 
virtual void draw_curves(double pt1, double rad) = 0; 

否则连接器会想念自己的定义。

+0

感谢您的回复。我以类似的方式编写了代码,但它给出了一些其他的编译错误..现在新的代码被添加在上面的问题..可以请你帮我。 – Red 2010-04-24 13:30:05

+0

@Niranjan,看到我的更新。 – 2010-04-24 13:46:05

-1

变化“类”到“结构”这使默认公有继承,而不是私人

6

我相信你试图创建一个虚基类。你需要“= 0”添加到的draw_lines和draw_curves方法的类Xsecs

class Xsecs 
{ 
public: 
    virtual void draw_lines(double pt1, double pt2) = 0; 
    virtual void draw_curves(double pt1, double rad) = 0; 
}; 

编译器抱怨结束,你没有有问题的任何方法实现。

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; 
}; 
相关问题