-
April 25th, 2010, 09:49 PM
#1
[RESOLVED] Using Variables for Intelligent Accessor Functions?
Hello everyone,
I’m an intermediate-level C++ programmer grappling with a fairly rudimentary problem. I’m creating a C++ object called FruitCart; FruitCart contains a number of integers categorizing the numbers of individual fruit in the cart. I also need FruitCart to contain accessor functions so other functions can set, retrieve, and print the fruit values. Here’s what I have so far:
--------------------------------------------------------------------------------------------------------
class FruitCart {
public:
// Constructors
FruitCart();
~FruitCart();
// Accessors
void SetApples(int a) {Apples=a;}
int GetApples() {return Apples;}
void PrintApples() {cout<<Apples;}
// Need accessor functions like the above for all kinds of fruit
protected:
int Apples; // Number of Apples in the cart
int Oranges; // Number of Oranges in the cart
int Bananas; // Number of Bananas in the cart
int Plums; // Number of Plums in the cart
// May have nearly 50 kinds of fruit!
};
--------------------------------------------------------------------------------------------------------
The problem I have is that I may have over fifty kinds of fruit in the cart! It would be a big pain to manually write out accessor functions for each kind of fruit.
I’m searching for a more intelligent solution. What I’d like to have is a general accessor function where I pass in the name of the fruit as a string (specifically, as a char * pointer) and leave everything else the same. Put in quasi-psuedocode:
--------------------------------------------------------------------------------------------------------
class FruitCart {
public:
// Constructors
FruitCart();
~FruitCart();
// Accessors
void SetFruit(int a, char * FruitType)
int GetFruit(char * FruitType)
void PrintFruit(char * FruitType)
protected:
int Apples; // Number of Apples in the cart
int Oranges; // Number of Oranges in the cart
int Bananas; // Number of Bananas in the cart
int Plums; // Number of Plums in the cart
};
void FruitCart::SetFruit(int a, char * FruitType)
{ ${FruitType} = a; }
int FruitCart::GetFruit(char * FruitType)
{ return ${FruitType}; }
void FruitCart::PrintFruit(char * FruitType)
{ cout << ${FruitType}; }
--------------------------------------------------------------------------------------------------------
Hopefully this makes sense. I know this would be simple to do in UNIX, so I’m hoping there’s a (relatively) simple way to do this in C++.
Many thanks!
-Pete
-
April 26th, 2010, 02:48 AM
#2
Re: Using Variables for Intelligent Accessor Functions?
Originally Posted by phummon
Hello everyone,
I’m an intermediate-level C++ programmer grappling with a fairly rudimentary problem. I’m creating a C++ object called FruitCart; FruitCart contains a number of integers categorizing the numbers of individual fruit in the cart. I also need FruitCart to contain accessor functions so other functions can set, retrieve, and print the fruit values. Here’s what I have so far:
--------------------------------------------------------------------------------------------------------
class FruitCart {
public:
// Constructors
FruitCart();
~FruitCart();
// Accessors
void SetApples(int a) {Apples=a;}
int GetApples() {return Apples;}
void PrintApples() {cout<<Apples;}
// Need accessor functions like the above for all kinds of fruit
protected:
int Apples; // Number of Apples in the cart
int Oranges; // Number of Oranges in the cart
int Bananas; // Number of Bananas in the cart
int Plums; // Number of Plums in the cart
// May have nearly 50 kinds of fruit!
};
--------------------------------------------------------------------------------------------------------
The problem I have is that I may have over fifty kinds of fruit in the cart! It would be a big pain to manually write out accessor functions for each kind of fruit.
I’m searching for a more intelligent solution. What I’d like to have is a general accessor function where I pass in the name of the fruit as a string (specifically, as a char * pointer) and leave everything else the same. Put in quasi-psuedocode:
--------------------------------------------------------------------------------------------------------
class FruitCart {
public:
// Constructors
FruitCart();
~FruitCart();
// Accessors
void SetFruit(int a, char * FruitType)
int GetFruit(char * FruitType)
void PrintFruit(char * FruitType)
protected:
int Apples; // Number of Apples in the cart
int Oranges; // Number of Oranges in the cart
int Bananas; // Number of Bananas in the cart
int Plums; // Number of Plums in the cart
};
void FruitCart::SetFruit(int a, char * FruitType)
{ ${FruitType} = a; }
int FruitCart::GetFruit(char * FruitType)
{ return ${FruitType}; }
void FruitCart::PrintFruit(char * FruitType)
{ cout << ${FruitType}; }
--------------------------------------------------------------------------------------------------------
Hopefully this makes sense. I know this would be simple to do in UNIX, so I’m hoping there’s a (relatively) simple way to do this in C++.
Many thanks!
-Pete
C++ does not do so well with converting strings to variable names. However, it works quite well with enums:
Code:
enum fruit
{
apples,
banana,
pizza, //I love that fruit
FRUIT_LAST_VALUE
};
In this case, apples will implicitly be equal to 0, banana to 1, pizza to 2, and finally, FRUIT_LAST_VALUE will have the convenience of being equal to 3, which is the size of your enum.
then in code, you can do this:
Code:
class FruitCart {
public:
// Constructors
FruitCart();
~FruitCart();
// Accessors
void SetFruit(fruit iFruit, int i) {_Fruits[iFruit] = i;}
int GetFruit(fruit iFruit) {return _Fruits[iFruit];}
void PrintFruit(fruit iFruit) {std::cout << _Fruits[iFruit];}
protected:
fruit _Fruits[FRUIT_LAST_VALUE]; //Array holding as many values as there are fruits. The cool part is that this should grow all by itself.
};
There, I hope that helps.
PS: A map will be able to do the string to fruit conversion you need, but I would highly advise against this type of implementation. C++ was not built for this kind of thing, and it will turn into a development nightmare. Perl was built for this, but don't force a language's paradigm into another one. When in Rome (C++) do as the Romans (C++ method of coding).
Last edited by monarch_dodra; April 26th, 2010 at 02:57 AM.
-
April 26th, 2010, 08:01 AM
#3
Re: Using Variables for Intelligent Accessor Functions?
Originally Posted by monarch_dodra
PS: A map will be able to do the string to fruit conversion you need, but I would highly advise against this type of implementation. C++ was not built for this kind of thing, and it will turn into a development nightmare. Perl was built for this, but don't force a language's paradigm into another one. When in Rome (C++) do as the Romans (C++ method of coding).
The difference is that with an enum your types of fruit are hard coded, whereas with a map they can be dynamic - e.g., they could be read from file. You (the OP) should pick the appropriate method according to your requirements.
Cheers, D Drmmr
Please put [code][/code] tags around your code to preserve indentation and make it more readable.
As long as man ascribes to himself what is merely a posibility, he will not work for the attainment of it. - P. D. Ouspensky
-
April 26th, 2010, 08:15 AM
#4
Re: Using Variables for Intelligent Accessor Functions?
Wow! Great advice! This is exactly what I was hoping to learn, many many thanks!!!
Yours,
-Pete
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|