Я не хочу, чтобы в моей программе можно было создать объект, не передавая аргументы конструктору.
Есть ли способ?
Я не хочу, чтобы в моей программе можно было создать объект, не передавая аргументы конструктору.
Есть ли способ?
Когда вы объявляете какой-либо другой конструктор, компилятор не будет генерировать для вас конструктор по умолчанию. Если вы указали конструктор без аргументов по умолчанию, вы можете сделать его закрытым.
Помните, что компилятор может автоматически генерировать каждую из этих четырех функций-членов для класса.
Но он не будет генерировать значение по умолчанию, если вы сами его объявили, т.е. если вы сами объявили конструктор, он не будет создавать конструктор по умолчанию. Если вы не объявили ни одного из других 3, компилятор может их генерировать.
edit: Обратите внимание, что эта информация относится к С++ 03, но в С++ 11 она отличается, как упоминает Маттиу М. в комментариях.
В то время как другие ответы верны, в С++ 11 есть новая методика для выражения: http://www2.research.att.com/~bs/C++0xFAQ.html#default
Это позволяет запретить функцию без какого-либо другого трюка. Он также четко выражает ваше намерение в коде.
class X
{
public:
X(int) {}
X() = delete; // will never be generated
};
int main()
{
X x; // will not compile;
X y(1); // will compile.
return 0;
}
Определите конструктор, который принимает правильный аргумент (ы). Это не позволит компилятору определить конструктор по умолчанию.
class X {
public:
X(int) {}
};
int main(){
X x; // will not compile;
X y(1); // will compile.
return 0;
}
Причина, по которой вы можете создать объект, не передавая аргументы конструктору, заключается в том, что у вас есть конструктор по умолчанию. Конструктор по умолчанию - это своего рода конструктор, который не имеет параметра или всех параметров, имеющих значения по умолчанию. И если вы не объявили какой-либо конструктор, компилятор сделает его для вас. Таким образом, решение очень просто. Вы можете объявить конструктор с параметром без значения по умолчанию, тогда компилятор не захочет сделать для вас конструктор.
создание непустого конструктора "отменяет" пустой конструктор по умолчанию, поэтому, если вы явно не создаете пустой конструктор, объекты не будут создаваться без аргументов.
Создайте собственный конструктор по умолчанию.