2013-09-04 5 views
0

вызов, который генерирует неразрешенный внешний символ:C++ - LNK 2019 Ошибка Попытка Определить Подкласс Static Function

#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() для устранения ошибки внешнего символа, но мне нужно определить их в моем производном классе. Что я думал, что делаю правильно, какие-то идеи?

+0

ли вы определили вам статические методы внутри вашего класса 'GContext' тоже? –

ответ

0

Нет Наследование не работает, это не похоже на виртуальную функцию.

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 
0

Я думаю, что это только потому, что статический метод не определен в базовом классе. От here сказано, что LNK2019 может также возникать, когда статический член данных объявлен, но не определен.


Кроме того, будьте осторожны при попытке переопределить статические методы в подклассах:

Вы не можете переопределить статический метод в подклассе, вы можете только скрыть его.

А из стандарта С ++:

9.4.1 Статические функции-члены [class.static.mfct]

2/Функция static член не должен быть virtual. Не должно быть static и нестатическая функция-член с тем же именем и теми же типами параметров (13.1). A static функция-член не объявляется const, volatile, или const volatile.

Example:

#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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^