Function Overloading Problem

H

Hayrola

I have two vaiable types, named A and B. These are of the same type,
int, but their values must be treated differently before printing. eg:

typedef int A;
typedef int B;

void func(A val)
{
VIPfunction(val);
std::cout << val << std::endl;
}

void func(B val)
{ //Error points to this line
std::cout << val << std::endl;
}


This gives me the following error: "function 'void func(A)' already
has a body"

Is there an easy way to solve this, or
is there another way to accomplish what i am trying to do?
 
A

Alf P. Steinbach

* Hayrola:
I have two vaiable types, named A and B. These are of the same type,
int, but their values must be treated differently before printing. eg:

typedef int A;
typedef int B;

void func(A val)
{
VIPfunction(val);
std::cout << val << std::endl;
}

void func(B val)
{ //Error points to this line
std::cout << val << std::endl;
}


This gives me the following error: "function 'void func(A)' already
has a body"

Is there an easy way to solve this, or
is there another way to accomplish what i am trying to do?

'typedef' just introduces a new name for a type. The two function
definitions above therefore have the same signature. They're different
definitions of the same function.

'struct', 'class' and 'enum' introduce new types.
 
J

Jim Langston

Hayrola said:
I have two vaiable types, named A and B. These are of the same type,
int, but their values must be treated differently before printing. eg:

typedef int A;
typedef int B;

void func(A val)
{
VIPfunction(val);
std::cout << val << std::endl;
}

void func(B val)
{ //Error points to this line
std::cout << val << std::endl;
}


This gives me the following error: "function 'void func(A)' already
has a body"

Is there an easy way to solve this, or
is there another way to accomplish what i am trying to do?

Basically, you are trying to do two different things with the same type
(int). One way would be to have 2 different functions, one with the
VIPfunction, one without.

Another way would be to wrap A and B in a structure or class. Then you
could make a func template and specialize for type B (which would be a
structure).

The questionn becomes, they are both ints. Calling one A and one B in a
typedef doesn't mean much. If you need to differentiate between them then
just keep them straight yourself somehow.

I can see what you are trying to accomplish, but the question is why? How
does this help your pogram? Depending on what you are actually trying to
achieve would say how it could be done.
 
H

Hayrola

Basically, you are trying to do two different things with the same type
(int). One way would be to have 2 different functions, one with the
VIPfunction, one without.

Another way would be to wrap A and B in a structure or class. Then you
could make a func template and specialize for type B (which would be a
structure).

The questionn becomes, they are both ints. Calling one A and one B in a
typedef doesn't mean much. If you need to differentiate between them then
just keep them straight yourself somehow.

I can see what you are trying to accomplish, but the question is why? How
does this help your pogram? Depending on what you are actually trying to
achieve would say how it could be done.

To clarify what i am doing, A represents a row number, and B
represents a column number.
In the good ol' game chess, rows have numbers (1234...), and columns
have letters (ABCD...).
Therefore the need to have them use different functons.

The already existing (C style) code assumes that A and B are ints, and
uses memsets and memcopys everywhere.

A solution has sprung into my mind, but i dont know if its a very good
one:

void func2(A val1, B val2 = -255)
{
if(val2 == -255)
{
VIPfunc();
std::cout << val1 << std::endl;
}
else
{
std::cout << val2 << std::endl;
}
}

any comments on that?
 
J

Jim Langston

Hayrola said:
To clarify what i am doing, A represents a row number, and B
represents a column number.
In the good ol' game chess, rows have numbers (1234...), and columns
have letters (ABCD...).
Therefore the need to have them use different functons.

The already existing (C style) code assumes that A and B are ints, and
uses memsets and memcopys everywhere.

A solution has sprung into my mind, but i dont know if its a very good
one:

void func2(A val1, B val2 = -255)
{
if(val2 == -255)
{
VIPfunc();
std::cout << val1 << std::endl;
}
else
{
std::cout << val2 << std::endl;
}
}

any comments on that?

In chess rows go from 1 to 8. Colums go from A to H. No other values are
legitimate.

void func2(int Val )
{
if ( Val >=1 && Val <= 8 )
// I have a row
else if ( Val >= 'A' && Val <= 'H' )
// I have a column
else
// Danger Will Roberson!
}
 
H

Hayrola

In chess rows go from 1 to 8. Colums go from A to H. No other values are
legitimate.

void func2(int Val )
{
if ( Val >=1 && Val <= 8 )
// I have a row
else if ( Val >= 'A' && Val <= 'H' )
// I have a column
else
// Danger Will Roberson!

}

There is just a minor problem... Both columns and rows are stored in
the format 0 to 7.
this so that they could be used like this: "theBoard[row][col]"

:(
 
?

=?ISO-8859-1?Q?Erik_Wikstr=F6m?=

To clarify what i am doing, A represents a row number, and B
represents a column number.
In the good ol' game chess, rows have numbers (1234...), and columns
have letters (ABCD...).
Therefore the need to have them use different functons.

The already existing (C style) code assumes that A and B are ints, and
uses memsets and memcopys everywhere.

A solution has sprung into my mind, but i dont know if its a very good
one:

void func2(A val1, B val2 = -255)

This implies to me that you know at the time you make the call whether
you have a row or a column, so why not simply make two different
functions with different names?
 
J

Jim Langston

Hayrola said:
In chess rows go from 1 to 8. Colums go from A to H. No other values
are
legitimate.

void func2(int Val )
{
if ( Val >=1 && Val <= 8 )
// I have a row
else if ( Val >= 'A' && Val <= 'H' )
// I have a column
else
// Danger Will Roberson!

}

There is just a minor problem... Both columns and rows are stored in
the format 0 to 7.
this so that they could be used like this: "theBoard[row][col]"

Then you need to either make two different functions, pass another parm
stating what the variable type is, or modify the parm to say.

The first method is rather obvoiu.

void funcRow2( int Val );
void funcCol2( int Val );

The second method I would just pass a bool

void func2( int Val, bool Row )
{
if ( Row )
// working with row
else
// working with column
}

The third method is sloppy and kludge.

void func2( int Val )
{
if ( Val > 255 )
{
// Dealing with Row
Val -= 255;
}
else
// Dealing with Column
}

Would be used like:

int Row, Col;
cin >> Row >> Col;

func2( Row + 255 );
func2( Col );

I am not suggesting you use the 2nd method, it's quite ugly and a kludge.
But it is possible.

Your last alternative would work, but I'd probably assign it a value of -1
instead of -255.

Overall, the best method if possible is to preprocess anythign you have to
for row if you can.

void Func2Row( int Val )
{
VIPfunc();
Func2( Val );
}

void Func2Col( int Val )
{
Func2( Val );
}

void Func2( int Val )
{
// whatever
}

I still think the best solution would be to have one function for Row, and
one function for Column, easiest to maintain.
 
H

Hayrola

There is just a minor problem... Both columns and rows are stored in
the format 0 to 7.
this so that they could be used like this: "theBoard[row][col]"

Then you need to either make two different functions, pass another parm
stating what the variable type is, or modify the parm to say.

The first method is rather obvoiu.

void funcRow2( int Val );
void funcCol2( int Val );

The second method I would just pass a bool

void func2( int Val, bool Row )
{
if ( Row )
// working with row
else
// working with column

}

The third method is sloppy and kludge.

void func2( int Val )
{
if ( Val > 255 )
{
// Dealing with Row
Val -= 255;
}
else
// Dealing with Column

}

Would be used like:

int Row, Col;
cin >> Row >> Col;

func2( Row + 255 );
func2( Col );

I am not suggesting you use the 2nd method, it's quite ugly and a kludge.
But it is possible.

Your last alternative would work, but I'd probably assign it a value of -1
instead of -255.

Overall, the best method if possible is to preprocess anythign you have to
for row if you can.

void Func2Row( int Val )
{
VIPfunc();
Func2( Val );

}

void Func2Col( int Val )
{
Func2( Val );

}

void Func2( int Val )
{
// whatever

}

I still think the best solution would be to have one function for Row, and
one function for Column, easiest to maintain.
Yes, i tink il'l go for two differently named functions.
Thanks Jim and Erik for great answers!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,781
Messages
2,569,619
Members
45,312
Latest member
Svsdvsdvs

Latest Threads

Top