Bonjour,

Tout d'abord voici le code (très simple):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
// RuleTest.cpp : Defines the entry point for the console application.
//
 
#include <iostream>
#include <map>
#include <string>
#include "stdafx.h"
 
class RuleType{
public:
    RuleType(int anId, std::string aName): id (anId), name (aName) {}
protected:
    int id;
    std::string name;
 
private:
    RuleType();
    static std::map< int, RuleType*> rules;
 
public:
    virtual int getID() {return id;}
    virtual std::string getName() {return name;}
    static void insertRule(int i, RuleType* rule) {rules[i] = rule;}
    static RuleType * getRule(int i) {return rules[i];}
};
 
 
class Rule1: public RuleType{
public:
    Rule1(int anId, std::string aName): RuleType(anId, aName) {}
 
private:
    Rule1();
    int idRule;
 
public:
    int performRule(int i) {return i;}
};
 
class Rule2: public RuleType{
public:
    Rule2(int anId, std::string aName): RuleType(anId, aName) {}
 
private:
    Rule2();
    int idRule;
 
public:
    std::string performRule(std::string str) {return str;}
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    Rule1 * rule1 = new Rule1(1, "Rule1");
    Rule2 * rule2 = new Rule2(2, "Rule2");
    RuleType::insertRule(rule1->getID(), rule1);
    RuleType::insertRule(rule2->getID(), rule2);
 
    Rule1 * ruletmp1 = dynamic_cast< Rule1 * > (RuleType::getRule(1));
    std::cout << "Rule1: " << ruletmp1->performRule(1) << std::endl;
 
    Rule2 * ruletmp2 = dynamic_cast< Rule2 * > (RuleType::getRule(2));
    std::cout << "Rule2: " << ruletmp2->performRule("Rule2") << std::endl;
 
    int i;
    std::cin >> i;
	return 0;
}
qui me donne cette erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Error	1	error LNK2001: unresolved external symbol 
"private: static class std::map<int,class RuleType *,struct std::less<int>,class std::allocator<struct std::pair<int const ,class RuleType *> > > RuleType::rules"
 (?rules@RuleType@@0V?$map@HPAVRuleType@@U?$less@H@std@@V?$allocator@U?$pair@$$CBHPAVRuleType@@@std@@@3@@std@@A)	RuleTest.obj
Je comprend pas vraiment pkoi j'ai cette erreur de compilation...

De plus je pense avoir un gros problème de conception, car je dois utiliser des dynamic_cast.
Le gros problème vient que je dois définir des règles différentes Rule1, Rule2, qui ont une fonction de base performRule qui peut prendre des paramêtres differents mais surtout retourne des types différents. Ceci m'empeche de definir RuleType comme abstraite avec la fonctions performRule en virtuelle pure.

Auriez vous des idées de conception pour résoudre ce problème.