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

no 继承不起作用,这不像是一个虚函数。

于 2013-09-04T20:27:50.377 回答
0

我不确定您要做什么,但是如果您

  • 需要有静态函数
  • 需要基类和派生类都有自己的实现
  • 派生需要访问基类的函数

这都是可以实现的:

#include <iostream>

class A {
public:
    A() {}
    static void f() { std::cout << "A f" << std::endl; }
};

class B : public A {
public:
    B() {}
    static void f() { std::cout << "B f" << std::endl; }
};




int main(int argc, char* argv[]) {

    A a;
    B b;

    a.f();
    b.f();
    b.A::f();
    return 0;
}

输出是

A f
B f
A f
于 2013-09-04T20:40:43.670 回答
0

我认为这只是因为你的静态方法没有在你的基类中定义。从这里可以说,当声明了静态数据成员但未定义时,也会发生 LNK2019。


此外,当您尝试在子类中重新定义静态方法时要小心:

您不能覆盖子类中的静态方法,只能隐藏它。

从 C++ 标准:

9.4.1 静态成员函数 [class.static.mfct]

2/成员函数不应该是. 不应存在​​具有相同名称和相同参数类型staticvirtualstatic(13.1)的非静态成员函数。static不得声明成员const函数、volatileconst 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 回答