Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未解析的外部符号链接器错误(C+;+;)_C++_Linker - Fatal编程技术网

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

C++ 未解析的外部符号链接器错误(C+;+;),c++,linker,C++,Linker,我正试图为我的一个项目开发抽象设计模式代码,如下所示。。但是,我无法编译代码..给出一些编译错误(如“unresolved external symbol”public:virtual void u thiscall Xsecs::draw_lines(double,double)”(?draw_lines@Xsecs@@UAEXNN@Z)" ).. 有人能帮我解决这个问题吗 #include "stdafx.h" #include <iostream> #include <

我正试图为我的一个项目开发抽象设计模式代码,如下所示。。但是,我无法编译代码..给出一些编译错误(如“unresolved external symbol”public:virtual void u 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;
}
#包括“stdafx.h”
#包括
#包括
#包括“Xsecs.h”
使用名称空间std;
//产品类别
Xsecs类
{
公众:
虚空绘制线(双pt1,双pt2);
虚拟空隙绘制曲线(双pt1,双rad);
};
类多段线:公共Xsecs
{
公众:
虚空绘制线(双pt1,双pt2)
{

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

class ProductA1 : ProductA
应该是

class ProductA1 : public ProductA

等等

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

class ProductA1 : public ProductA {
...
如果没有
public
关键字,此关系是私有继承,而不是is-a关系,因此您不能简单地从
ProductA1
强制转换为
ProductA

Scott Meyers在第39项中解释了这一点:

[…]编译器,当给定一个类
Student
公开继承自类
Person
的层次结构时,当函数调用成功需要时,会隐式地将学生转换为Person

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

私有继承意味着按照实现。如果您使类
D
从类
B
私有继承,那么这样做是因为您有兴趣利用类
B
中的一些可用功能,而不是因为类型
B
的对象与<因此,私有继承纯粹是一种实现技术

更新第二版帖子:如果你想要纯虚拟函数,你应该这样声明:

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

否则链接器将丢失其定义。

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

我假定您试图创建一个虚拟基类。您需要在类Xsecs中的draw_line和draw_curves方法的末尾添加“=0”

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

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

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


谢谢你的回复。我已经用类似的方式编写了代码,但是它给出了一些其他的编译错误。现在在上面的问题中添加了新的代码。你能帮我一下吗?@Niranjan:如果你有后续问题,请编辑你原来的问题或问一个新问题。不要替换你的旧问题,因为这会使问题变得非常混乱答案与问题不再相符。