Вы не можете запретить дочернему классу определять собственный конструктор копирования / перемещения. Тем не менее, это предотвратит его «из коробки», то есть если вы его не предоставите или используете встроенный конструктор по умолчанию, он также будет помечен как удаленный. Причина, по которой вы получаете ошибку здесь, когда вы пытаетесь просто определить конструктор по умолчанию, заключается в том, что вам не разрешено делать это во внешнем определении, когда член или база неявно удалили его. Если бы вы использовали
class DerivedClass : public BaseClass {
public:
DerivedClass(const DerivedClass &) = default;
bool doSomething() override;
};
, код скомпилировался бы, и вы бы получили ошибку, только если вы на самом деле попытаетесь вызвать конструктор копирования. Это работает, потому что встроенное неявное значение по умолчанию разрешено, даже если член или база неявно удаляют его, а конечный результат - конструктор, неявно удаляемый.
Я начну этот пост, заявив, что я использую Apache Maven для сборки. Вы также можете сделать то же самое с Ant или другим инструментом, но это то, что я сделал с помощью maven.
Лучший способ, который я нашел, чтобы справиться с этим, это использовать версию вашего проекта плюс ревизию subversion как номер сборки. Из Maven вы можете включить следующее. Это даст вам номер версии subversion как $ {scm.revision}.
<build>
<plugins>
<plugin>
<artifactId>maven-scm-plugin</artifactId>
<executions>
<execution>
<id>getting-scm.revision</id>
<phase>validate</phase>
<goals>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
После этого я использую его как часть манифеста jar-файла в качестве Версии реализации.
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.1</version>
<configuration>
<archive>
<manifestEntries>
<Implementation-Version>${this.version}.${scm.revision}</Implementation-Version>
</manifestEntries>
</archive>
</configuration>
</plugin>
Приятная вещь в том, что Вы можете получить доступ к этому из кода, используя следующее:
Package p = getClass().getPackage();
String version = p.getImplementationVersion();
Это дает вам полный номер сборки, такой как «1.0.13525», где последним номером является ревизия Subversion.
Так как я использую круиз-контроль и Ant , чтобы собрать все Я закончил, по крайней мере, на данный момент, используя свойство $ {label} , переданное в вызов ant для построения проекта. В моем файле ant я использую задачу Ant «replace» , чтобы изменить файл свойств, который содержит ресурс about box с именем Application.version, для включения этой метки.
Я планирую изменить с пометить инкрементатор на инкрементатор меток svn и затем использовать номер ревизии svn. Это просто немного больше работы и требует внесения изменений в файл конфигурации круиз-контроля.
Сценарий сборки должен создать файл свойств, содержащий версию. Это хорошая идея, чтобы получить ревизию # непосредственно из SVN. Таким образом, вы можете обратиться к нему в тестах. Поместите этот файл свойств в упакованный файл и прочитайте его во время выполнения. Обычно в качестве параметров для ant scrpt устанавливаются старшая и младшая версии, а SVN управляет ревизией автоматически и дает согласованный номер сборки для ссылок.
Этот целевой фрагмент кода запускает командную строку svn и выводит ее во временный файл (svndump). Поместите этот файл свойств в упакованный файл и прочитайте его во время выполнения. Обычно в качестве параметров для ant scrpt устанавливаются старшая и младшая версии, а SVN управляет ревизией автоматически и дает согласованный номер сборки для ссылок.
Этот целевой фрагмент кода запускает командную строку svn и выводит ее во временный файл (svndump). Поместите этот файл свойств в упакованный файл и прочитайте его во время выполнения. Обычно в качестве параметров для ant scrpt устанавливаются старшая и младшая версии, а SVN управляет ревизией автоматически и дает согласованный номер сборки для ссылок.
Этот целевой фрагмент кода запускает командную строку svn и выводит ее во временный файл (svndump). Then constructing xx.yy.zz string, place it in another file which will be later included into jar. Note that xx.yy are taken from external parameters, this is major-minor version.
<target name="getrev">
<exec executable="svn" output="svndump">
<arg value="info"/>
<arg value="${my.svn.url}"/>
</exec>
<property file="svndump"/>
<property name="my.build" value="${Revision}"/>
<property name="my.rev" value="${my.ver}.${my.build}"/>
<echo message="current revision is ${my.rev}"/>
<property name="my.dir.dist" value="${my.dir.root}/dist/${my.rev}"/>
<echo message="${my.rev}" file="${my.dir.projects}/revision"/>
<delete file="svndump"/>
</target>
С Maven я использовал buildnumber-maven-plugin , который получает номер ревизии из Subversion или использует последовательность или метку времени, которая затем используется заменить заполнитель $ {buildNumber}
где угодно. Я предполагаю, что другие инструменты сборки и серверы непрерывной интеграции имеют аналогичные функции. Найдите в своей любимой поисковой системе «номер сборки
Ты делаешь это слишком сложным. SVN предоставляет номер версии в виде макроса, например, CVS.
Создайте простой инверсионный файл, содержащий константу, и сделайте так, чтобы SVN инстанцировал это с помощью макроса, например,
public interface IVersionNumber {
public static final String version = "$Id$" ;
}
. Вы должны указать SVN использовать ключевые слова в этом файле, как
$ svn propset svn: ключевые слова «Id» IVersion.java
Вы можете прочитать о свойствах здесь .
Мы давно использовали JReleaseInfo . Вы можете установить его в своем скрипте Ant (мы не используем Maven для наших проектов), и он автоматически увеличивает номер версии. Он также имеет некоторые приятные дополнения в том, что он генерирует класс, содержащий всю информацию. Вы можете просто вызвать этот класс в своем коде, чтобы получить готовые строки для использования, или вызвать класс из командной строки, чтобы он распечатал номер версии без необходимости изменения какого-либо кода.