2016-12-27 8 views
0

У меня есть следующие классы:Visual C++ 2010 Ошибка: LNK2020 Нерешенные лексема

public ref class Form1 : public System::Windows::Forms::Form 
{ 
//[...] 
protected: 
System::Void label1_Click(System::Object^ sender, System::EventArgs^ e); 
}; 

public ref class Functions : public Form1 
{ 
protected: 
void Example() {} 
}; 

public ref class Handlers : public Functions 
{ 
private: 
    System::Void label1_Click(System::Object^ sender, System::EventArgs^ e) 
    { 
    Example(); 
    } 
}; 

Как вы можете видеть, что я хочу, чтобы мой метод Экстерн в дополнительный класс. Ошибка:

1>Milionerzy.obj : error LNK2020: unresolved token (06000004) Milionerzy.Form1::label1_Click

Что не так?

+0

Вы должны дать определение 'Form1 :: label1_Click' или объявить его чистым виртуальным. –

+0

Я пытаюсь использовать виртуальный класс класса Form1 [код] virtual system :: Void label1_Click (System :: Object^sender, System :: EventArgs^e) = 0; [/ code] И у меня много ошибок. Я использую это решение: [ссылка] http://stackoverflow.com/questions/2652198/difference-between-a-virtual-function-and-a-pure-virtual-function [/ link] – Zomfire

+0

1> c : \ users \ michal \ documents \ visual studio 2010 \ projects \ milionerzy \ milionerzy \ Form1.h (505): см. объявление 'Milionerzy :: Form1 :: label1_Click' 1> 'void Milionerzy :: Form1 :: label2_Click (System :: Object ^, System :: EventArgs ^) ': is abstract – Zomfire

ответ

0

Возможно, вы должны удалить ярлык1_Click из Form1. Нет никакого смысла обрабатывать событие click1 click1 вообще, поскольку вы думаете о том, чтобы сделать его чистым виртуальным. Просто справитесь с этим, когда сможете.

Если вы хотите полиморфизм в обработчике объявить другую чистую виртуальную функцию, как это:

public ref class Form1 abstract: public System::Windows::Forms::Form 
{ 
//[...] 
protected: 
    virtual void OnLabel1Click()=0; 
}; 

public ref class Functions : public Form1 
{ 
protected: 
    void Example() 
    { 
    } 
    virtual void OnLabel1Click() override 
    { 
     Example(); 
    } 
}; 

public ref class Handlers : public Functions 
{ 
private: 
    System::Void label1_Click(System::Object^ sender, System::EventArgs^ e) 
    { 
     OnLabel1Click(); 
    } 
}; 
+0

Спасибо за ваш ответ. Но в этом случае я должен поместить все настройки каждой метки (или других элементов) в первый класс, чтобы увидеть ее в дизайне. Это должно быть вставлено в класс, что дочерний элемент (public System :: Windows :: Forms :: Form). Я не хочу этого. – Zomfire

+0

В этом случае удалите все абстрактные свойства и обработайте событие click1 click1 в Form1, вызывая виртуальный (но не чистый) OnLabelClick. Итак, Form1 :: OnLabelClick ничего не сделает, и вы переопределите его в классе Handlers. – GeorgeT