繁体   English   中英

未解析的外部符号链接器错误(C ++)

[英]Unresolved External Symbol linker error (C++)

我正在尝试为我的一个项目开发抽象设计模式代码,如下所示..但是,我无法编译代码..一些编译错误(如“未解析的外部符号”public:virtual void __thiscall Xsecs :: draw_lines (双,双)“(?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;
}

我假设您正在尝试创建虚拟基类。 您需要在类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;
};

编译器抱怨,因为您没有任何相关方法的实现。

你应该公开从A继承,比如

class ProductA1 : public ProductA {
...

如果没有public关键字,这种关系就是私有继承 ,它不是is-a关系,因此您不能简单地从ProductA1ProductA

Scott Meyers在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;

否则链接器将错过它们的定义。

在所有类定义中,您忘记使用public关键字:

class ProductA1 : ProductA

应该

class ProductA1 : public ProductA

等等

您需要为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;
};

将“class”改为“struct”这使得默认的公共继承而不是私有

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM