C++ 未解析的外部符号链接器错误(C+;+;)
我正试图为我的一个项目开发抽象设计模式代码,如下所示。。但是,我无法编译代码..给出一些编译错误(如“unresolved external symbol”public:virtual void u thiscall Xsecs::draw_lines(double,double)”(?draw_lines@Xsecs@@UAEXNN@Z)" ).. 有人能帮我解决这个问题吗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 <
#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:如果你有后续问题,请编辑你原来的问题或问一个新问题。不要替换你的旧问题,因为这会使问题变得非常混乱答案与问题不再相符。