#c #constructor
#c #конструктор
Вопрос:
У меня есть класс Foo
, который имеет 2 ctor: один по умолчанию и параметризованный. В моем классе также есть два метода: foo
и bar
. foo
допустимо для вызова любого экземпляра класса и bar
допустимо для вызова только в том случае, если объект был создан параметризованным ctor.
class Foo {
public:
Foo() = default;
Foo(int a) { ... }
void foo() { ... }
void bar() { ... }
};
Я хочу, чтобы только foo
метод был доступен, если класс был создан ctor по умолчанию, и foo
и bar
будет доступен, если класс был создан вторым ctor.
Я могу сделать это, создав некоторую переменную внутреннего состояния класса (скажем, _state
), которая будет инициализирована в обоих ctors и которая будет указывать, какой ctor был вызван
Foo::Foo() {
_state = 1;
}
Foo::Foo(int a) {
_state = 2;
}
Используя эту переменную, я могу проверить во время выполнения, какой класс ctor использовался внутри foo
и bar
функционирует:
void Foo::bar() {
if (_state != 2) {
throw std::runtime_error("Use another ctor");
}
}
Поскольку известно, какой ctor использовался во время компиляции, есть ли какой-либо способ также выполнить такие проверки при вызове методов, которые вызовут ошибку во время компиляции, если использовался неправильный ctor?
Комментарии:
1. Вы знаете «во время компиляции», какой конструктор был вызван в этом конструкторе . Если метод этого класса вызывается из кода, который вызывается из какого-либо другого
.cpp
файла, который компилируется отдельно, для объекта, который был создан в третьем.cpp
файле, как вы предполагаете, что второй.cpp
файл, который компилируется отдельно, может знать, как был создан объект? Извините, но C просто не работает таким образом.2.Если класс, который инициализируется параметризованным конструктором, является a
Foo
, он может наследовать отFoo
instead и помещаться толькоbar()
в этот класс. пример3. Спасибо за ответ!