簡體   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