2014-09-15 4 views
-1

Я изо всех сил стараюсь использовать наследование. Я изучаю информатику и должен ее решить ... Rihgt теперь я пытаюсь создать свой собственный класс «Копировать», который содержит ссылку на объект «Drawable», Например, у меня есть объект класса «круг», который наследуется от «Drawable». Я хочу сделать копию упомянутого объекта «круг», который, похоже, работает нормально. Но когда я хочу вызвать метод «рисования», все становится кислым.ошибка LNK2001: нерешенный внешний символ - я не могу заставить ПРОСТОЕ НАСЛЕДИЕ работать в C++

Сообщение об ошибке:

1>------ Build started: Project: Project2, Configuration: Debug Win32 ------ 
1> main.cpp 
1> Drawable.cpp 
1> copy.cpp 
1> Cirkel.cpp 
1> Generating Code... 

1>Cirkel.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Drawable::draw(class sf::RenderWindow &,class sf::Vector2<float>)" ([email protected]@@[email protected]@@[email protected]@[email protected]@Z) 

1>copy.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Drawable::draw(class sf::RenderWindow &,class sf::Vector2<float>)" ([email protected]@@[email protected]@@[email protected]@[email protected]@Z) 

** Это мое главное: **

#include <SFML\Graphics> 
#include "circle.hpp" 
#include "copy.hpp" 


int main(){ 

    sf::RenderWindow window{ sf::VideoMode{ 640, 480 }, "SFML window" }; 

    circle blauwe_circle{ 40.0F, sf::Color::Blue }; 
    circle rode_circle{ 10.F, sf::Color::Red }; 

    copy cBlauw{ sf::Vector2f{ 40.f, 40.f }, blauwe_circle }; 
    copy cRoodA{ sf::Vector2f{ 50.f, 50.f }, rode_circle }; 

    sf::Vector2f nul{ 0.f, 0.f }; 



    while (window.isOpen()){ 

     sf::Event event; 
     while (window.pollEvent(event)){ 
      if (event.type == sf::Event::Closed) window.close(); 
     } 
     sf::sleep(sf::milliseconds(20)); 
    } 
    return 0; 
}` 

drawable.hpp

class Drawable 
{ 
    public: 
     virtual void draw(sf::RenderWindow & window, sf::Vector2f vector); 
}; 

Circle.hpp:

#include "Drawable.hpp" 

class circle : public Drawable{ 

    public: 

    circle(float size = 30, sf::Color color = sf::Color::Red); 

    void draw(sf::RenderWindow & window, sf::Vector2f position) override; 

    private: 

    float size; 
    sf::Color color; 
    sf::CircleShape c; 

}; 

cirlce.cpp

#include "circle.hpp" 
#include "Drawable.hpp" 

circle::circle(float fSize, sf::Color color) : 
    size{ fSize }, 
    color{ color } 
{ 
    c.setRadius(size); 
    c.setPointCount(30U); 
    c.setFillColor(color); 
} 

void circle::draw(sf::RenderWindow & window, sf::Vector2f position){ 
    c.setPosition(position); 
    window.draw(c); 
} 

copy.hpp:

#include "Drawable.hpp" 

class copy: public Drawable 
{ 
    public: 
     copy(sf::Vector2f position, Drawable & c); 
     void draw(sf::RenderWindow & window, sf::Vector2f vector) override; 
    private: 
     sf::Vector2f position; 
     Drawable & c; 
}; 

copy.cpp

#include "copy.hpp" 
#include "Drawable.hpp" 

copy::copy(sf::Vector2f vPosition, Drawable & c) : 
    position{ vPosition }, 
    c{ c } 
{} 

void copy::draw(sf::RenderWindow & window, sf::Vector2f v){ 
    c.draw(window, v); 
} 
+1

'Drawable :: draw', метод не имеет реализации (или его нету показано) – Borgleader

+1

Убедитесь, что вы показать * точное * сообщение об ошибке. Как еще мы должны знать, что нерешено? – crashmstr

+0

Сообщение об ошибке заключается в том, что компилятор не может найти реализацию для 'Drawable :: draw'. Как отметил Borgleader, код, который вы опубликовали, не включает реализацию для «Drawable :: draw», которая предполагает, что это ваша проблема. Поскольку AlexD уже сказал в ответе, если вы не хотите реализации для Drawable :: draw, вам нужно пометить метод pure virtual. –

ответ

2

Если Drawable::draw предназначен для чистой виртуальной функции без реализации, добавьте = 0:

class Drawable 
{ 
    public: 
     virtual void draw(sf::RenderWindow & window, sf::Vector2f vector) = 0; 
}; 
+0

Большое спасибо AlexD! Я добавил его в свой код, и теперь он работает безупречно! ^^ – Pim