0

未解決の外部シンボルを生成する呼び出し:

#include <string.h>
#include "GContext.h"
#include "GBitmap.h"
#include "GColor.h"

int main(int argc, char** argv) {
    const int W = 100;
    const int H = 100;
    GContext* ctx = GContext::Create(W, H);

抽象クラス メソッドのシグネチャ:

#ifndef GContext_DEFINED
#define GContext_DEFINED

#include "GTypes.h"

class GBitmap;
class GColor;

class GContext {
public:
    GContext() {}
    virtual ~GContext() {}


    virtual void getBitmap(GBitmap*) const = 0;

    virtual void clear(const GColor&) = 0;


    static GContext* Create(const GBitmap&);

    static GContext* Create(int width, int height);
};

#endif

そして、現在の派生クラスの実装とメソッド シグネチャ:

#include "GColor.h"
#include "GPixel.h"
#include "GBitmap.h"
#include "GContext.h"
#include "GTypes.h"
class myGContext : public GContext
{
public:
        myGContext() : GContext(){}
        static const GBitmap* bitmap;

        void getBitmap(GBitmap* bitmap) const
        {

        }

        void clear(const GColor& gcolor)
        {
        int length = sizeof( (GPixel)(bitmap->fPixels) ) / sizeof(GPixel);
        for (int i = 0; i < length; i++)
        {
            (bitmap->fPixels)[i]
        }

        }

        static GContext* Create(const GBitmap& gbitmap)
        { 
        GContext::Create(gbitmap);
        bitmap = &gbitmap;
        GContext* g = new myGContext();
        return g;
        }


        static GContext* Create(int width, int height)
        {
        GContext::Create(width,height);
        GContext* g = new myGContext();
        return g;

    }
};

したがって、外部シンボル エラーを解決するには両方のタイプの関数 GContext::Create() を定義する必要があることは理解していますが、派生クラスでそれらを定義する必要があります。私はどちらが正しいと思っていましたか、何かアイデアはありますか?

4

3 に答える 3

0

基本クラスで静的メソッドが定義されていないためだと思います。ここから、 LNK2019 は、静的データ メンバーが宣言されているが定義されていない場合にも発生する可能性があると言われています。


また、サブクラス内で静的メソッドを再定義しようとするときは注意してください。

サブクラスの静的メソッドをオーバーライドすることはできません。非表示にすることしかできません。

そしてC++標準から:

9.4.1 静的メンバー関数 [class.static.mfct]

2/メンバー関数はstaticあってはなりませんvirtualstatic同じ名前と同じパラメーター型 (13.1) を持つ非静的メンバー関数があってはなりません(13.1)。メンバー関数は、、、またはstaticを宣言してはなりません。constvolatileconst volatile

#include <iostream>

class Foo
{
public:
  static void func() { std::cout << "Foo::func" << std::endl; }
};

class Bar : public Foo
{
public:
  static void func() { std::cout << "Bar::func" << std::endl; }
};

int main(void)
{
  Foo::func();     // Works
  Bar::func();     // Works

  Foo foo;
  Bar bar;

  foo.func();        // Works
  bar.func();        // Works
  bar.Foo::func();   // Works

  Foo* foobar = new Bar;

  foobar->func();      // Not the result expected
                       // Because no override.
  return 0;
}
于 2013-09-04T20:42:30.457 に答える
0

いいえ 継承は機能しません。これは仮想関数とは異なります。

于 2013-09-04T20:27:50.377 に答える