The structs are public, so other classes use instances of them when working with the containing class.
Also, imagine this code (but ignore its simplicity):
Code:
class Example
{
public:
struct Data
{
std::string name;
std::string value;
};
struct Separators
{
std::string middle;
std::string end;
};
void OutputData(bool bMaleNotFemale) const;
private:
Data north_data;
Data south_data;
Data east_data;
Data west_data;
Separators male_sep;
Separators female_sep;
};
void Example::OutputData(bool bMaleNotFemale) const
{
if (bMaleNotFemale)
{
std::cout << north_data.name << male_sep.middle;
std::cout << north_data.value << male_sep.end;
std::cout << south_data.name << male_sep.middle;
std::cout << south_data.value << male_sep.end;
std::cout << east_data.name << male_sep.middle;
std::cout << east_data.value << male_sep.end;
std::cout << west_data.name << male_sep.middle;
std::cout << west_data.value << male_sep.end;
}
else
{
std::cout << north_data.name << female_sep.middle;
std::cout << north_data.value << female_sep.end;
std::cout << south_data.name << female_sep.middle;
std::cout << south_data.value << female_sep.end;
std::cout << east_data.name << female_sep.middle;
std::cout << east_data.value << female_sep.end;
std::cout << west_data.name << female_sep.middle;
std::cout << west_data.value << female_sep.end;
}
}
Now, obviously, that's pretty lame code duplication, right? What if I did this instead:
Code:
class Example
{
public:
struct Data
{
std::string name;
std::string value;
};
struct Separators
{
std::string middle;
std::string end;
};
void OutputData(bool bMaleNotFemale) const;
private:
void OutputData(const Data& data, const Separators& sep) const;
Data north_data;
Data south_data;
Data east_data;
Data west_data;
Separators male_sep;
Separators female_sep;
};
void Example::OutputData(bool bMaleNotFemale) const
{
const Separators& sep = bMaleNotFemale ? male_sep : female_sep;
OutputData(north_data, sep);
OutputData(south_data, sep);
OutputData(east_data, sep);
OutputData(west_data, sep);
}
void Example::OutputData(const Data& data, const Separators& sep) const
{
std::cout << data.name << sep.middle;
std::cout << data.value << sep.end;
}
Voila!