Hi all, I'm encountering this while trying to implement a factory
singleton method to generate objects.
The singleton has a static map which binds a static creation function
defined in each class to the type of the object to be created.
Here it is the code, which is a modification of the wikipedia C++
factory example code:
----------------------------------8<--------------------------------
#include <string>
#include <iostream>
#include <map>
class Pizza {
public:
virtual void get_price() = 0;
};
class HamAndMushroomP izza: public Pizza {
public:
virtual void get_price(){
std::cout << "Ham and Mushroom: $8.5" << std::endl;
}
static Pizza* create_pizza()
{
return new HamAndMushroomP izza;
}
};
class DeluxePizza : public Pizza {
public:
virtual void get_price() {
std::cout << "Deluxe: $10.5" << std::endl;
}
static Pizza* create_pizza()
{
return new DeluxePizza;
}
};
class SeafoodPizza : public Pizza {
public:
virtual void get_price(){
std::cout << "Seafood: $11.5" << std::endl;
}
static Pizza* create_pizza()
{
return new SeafoodPizza;
}
};
class PizzaFactory {
private:
static std::map<std::s tring, (Pizza *)(*)()creators ;
init() {
map["Deluxe"] = DeluxPizza::cre ate_pizza;
map["Ham and Mushroom"] = HamAndMushroom: :create_pizza;
map["Seafood"] = SeafoodPizza::c reate_pizza;
}
public:
PizzaFactory* get_instance()
{
static PizzaFactory instance = 0;
if (!instance) {
instance = new PizzaFactory;
instance.Init() ;
}
return instance;
}
static Pizza* create_pizza(co nst std::string type) {
PString type = config.GetAttri bute("type");
if ((it = creators.find(t ype) != creators.end()) )
return (it->second)();
else
return 0;
}
};
// usage
int main() {
PizzaFactory* factory = PizzaFactory::g et_instance();
Pizza *pizza = 0;
pizza = factory->create_pizza(" Default");
pizza->get_price();
delete pizza;
pizza = factory->create_pizza(" Ham and Mushroom");
pizza->get_price();
delete pizza;
pizza = factory->create_pizza(" Seafood Pizza");
pizza->get_price();
delete pizza;
}
----------------------------------8<--------------------------------
The static map declaration syntax is somehow wrong, and after hitting
my head sometime I still can't get out of it.
I'm using g++ 4.3.1, and the syntax error I get is this:
make PizzaFactory2; and PizzaFactory2
g++ -I/home/stefano/opt/reilabs/include -I/home/stefano/include -O0 -g -ggdb PizzaFactory2.c xx -c -o PizzaFactory2.o
PizzaFactory2.c xx:50: error: `*' cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: a function call cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: `*' cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: a function call cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: a function call cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: template argument 2 is invalid
The exact line of the error is:
static std::map<std::s tring, (Pizza *)(*)()creators ;
which I interpret as:
a static map from string to a static method pointer which takes no
parameters and returns a pointer to a Pizza object.
What am I missing or what I'm doing wrongly?
Regards and many help in advance.
singleton method to generate objects.
The singleton has a static map which binds a static creation function
defined in each class to the type of the object to be created.
Here it is the code, which is a modification of the wikipedia C++
factory example code:
----------------------------------8<--------------------------------
#include <string>
#include <iostream>
#include <map>
class Pizza {
public:
virtual void get_price() = 0;
};
class HamAndMushroomP izza: public Pizza {
public:
virtual void get_price(){
std::cout << "Ham and Mushroom: $8.5" << std::endl;
}
static Pizza* create_pizza()
{
return new HamAndMushroomP izza;
}
};
class DeluxePizza : public Pizza {
public:
virtual void get_price() {
std::cout << "Deluxe: $10.5" << std::endl;
}
static Pizza* create_pizza()
{
return new DeluxePizza;
}
};
class SeafoodPizza : public Pizza {
public:
virtual void get_price(){
std::cout << "Seafood: $11.5" << std::endl;
}
static Pizza* create_pizza()
{
return new SeafoodPizza;
}
};
class PizzaFactory {
private:
static std::map<std::s tring, (Pizza *)(*)()creators ;
init() {
map["Deluxe"] = DeluxPizza::cre ate_pizza;
map["Ham and Mushroom"] = HamAndMushroom: :create_pizza;
map["Seafood"] = SeafoodPizza::c reate_pizza;
}
public:
PizzaFactory* get_instance()
{
static PizzaFactory instance = 0;
if (!instance) {
instance = new PizzaFactory;
instance.Init() ;
}
return instance;
}
static Pizza* create_pizza(co nst std::string type) {
PString type = config.GetAttri bute("type");
if ((it = creators.find(t ype) != creators.end()) )
return (it->second)();
else
return 0;
}
};
// usage
int main() {
PizzaFactory* factory = PizzaFactory::g et_instance();
Pizza *pizza = 0;
pizza = factory->create_pizza(" Default");
pizza->get_price();
delete pizza;
pizza = factory->create_pizza(" Ham and Mushroom");
pizza->get_price();
delete pizza;
pizza = factory->create_pizza(" Seafood Pizza");
pizza->get_price();
delete pizza;
}
----------------------------------8<--------------------------------
The static map declaration syntax is somehow wrong, and after hitting
my head sometime I still can't get out of it.
I'm using g++ 4.3.1, and the syntax error I get is this:
make PizzaFactory2; and PizzaFactory2
g++ -I/home/stefano/opt/reilabs/include -I/home/stefano/include -O0 -g -ggdb PizzaFactory2.c xx -c -o PizzaFactory2.o
PizzaFactory2.c xx:50: error: `*' cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: a function call cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: `*' cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: a function call cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: a function call cannot appear in a constant-expression
PizzaFactory2.c xx:50: error: template argument 2 is invalid
The exact line of the error is:
static std::map<std::s tring, (Pizza *)(*)()creators ;
which I interpret as:
a static map from string to a static method pointer which takes no
parameters and returns a pointer to a Pizza object.
What am I missing or what I'm doing wrongly?
Regards and many help in advance.
Comment