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

4

我正在尝试为我的一个项目开发抽象的设计模式代码,如下所示.. 但是,我无法编译代码..会出现一些编译错误(例如“未解决的外部符号“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;
}

1
@Niranjan:如果您有后续问题,请编辑您的原始问题或提出新问题。不要替换旧问题;这会使答案不再与问题匹配,非常令人困惑。 - James McNellis
5个回答

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;
};

编译器在抱怨,因为您没有实现相应的方法。

2
你应该公开地从 A 继承,像这样:
class ProductA1 : public ProductA {
...

没有使用public关键字,这种关系是私有继承,不是一个is-a关系,因此你不能简单地从ProductA1转换到ProductA
Scott Meyers在Effective C++, 第三版的第39项中解释了这一点。
编译器在给定一个公共继承关系的层次结构中,当类 Student 公开继承自类 Person 时,在函数调用需要成功时会隐式地将 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;

否则,链接器将无法找到它们的定义。

谢谢您的回复。我已经以类似的方式编写了代码,但是它会出现其他的编译错误。现在新的代码已添加到上面的问题中。您能帮助我解决吗? - Red

1
在你所有的类定义中,你忘记使用public关键字了:
class ProductA1 : ProductA

应该是

class ProductA1 : public ProductA

等等


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;
};

-1
将“class”更改为“struct”,这将使默认的继承方式为公有而不是私有。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接