Все экземпляры структуры или класса имеют одинаковую структуру. К счастью, есть некоторые трюки, которые можно использовать для «имитации» того, что вы пытаетесь сделать.
Первый трик (который также может быть использован в C), состоит в использовании соединения, например .:
struct MyStruct
{
int field1;
char field2;
int type;
union
{
int field3a;
char field3b;
double field3c;
} field3;
};
В союзе, все члены занимают то же пространство в памяти. Как программист, вы должны быть осторожны. Вы можете выйти из профсоюза только тем, что вы вложили. Если вы инициализируете одного члена профсоюза, но вы читаете другого члена, вы, вероятно, получите мусор (если вы не хотите делать некоторые хакеры низкого уровня, но не делаете это, если вы не очень опытные).
Союзы часто объединяются с другим полем (вне союза), которое указывает, какой элемент фактически используется в союзе. Вы могли бы считать это своим «условием».
Второй трюк использует шаблон состояния (см. http://en.wikipedia.org/wiki/State_pattern). Из внешнего мира контекстный класс выглядит всегда одинаково, но внутри страны разные государства могут содержать различные виды информации.
Несколько упрощенным подходом к состоянию является использование простого наследования и использование динамических бросков. В зависимости от вашего «состояния» используйте другой подкласс и выполняйте динамический подбор, чтобы получить конкретную информацию.
Например, предположим, что у нас есть класс Country. В некоторых странах есть президент, у других есть король, у других - император. Вы могли бы что-то вроде этого:
class Country
{
...
};
class Republic : public Country
{
public:
const string &getPresident() const;
const string &getVicePresident() const;
};
class Monarchy : public Country
{
public:
const string &getKing() const;
const string &getQueen() const;
};
В приложении вы можете работать с указателями на страны, и сделать динамическое приведение в республику или монархию, где нужен президент или король.
Этот пример может быть легко преобразован в один, используя шаблон состояния, но я оставляю это как упражнение для вас.
Лично я бы пошел за государственным образцом. Я не большой поклонник динамических бросков, и они всегда кажутся мне чем-то вроде взлома.
Вы можете это сделать? Это зависит. Каковы ваши дополнительные условия? Определены ли они во время выполнения? Во время компиляции? Как? ... –
Это зависит от того, какие именно условия. –
C++ не является динамически типизированным языком, поэтому вы не можете этого сделать. Может быть, если вы объясните, чего вы пытаетесь достичь, тогда мы могли бы помочь немного больше. –