Обратите внимание, что если вам это нужно в ситуации развертывания, подумайте о том, чтобы использовать Java WebStart (с версией «ondisk», а не сетевой, возможно в Java 6u10 и более поздней версии), поскольку он позволяет вам указать различные аргументы JVM в кросс-платформенном способе.
В противном случае вам понадобится специальная пусковая установка операционной системы, которая задает нужные вам аргументы.
Используйте член данных или частный базовый класс вместо общедоступного базового класса.
Затем вы контролируете доступ к этому члену.
Вы можете сделать свойство Property абстрактным интерфейсом, если вам нужно полиморфное поведение.
Вы можете использовать класс шаблона и специализацию для константного типа:
template<typename T> class base_property {
protected:
T value;
};
template<typename T> class property : public base_property<T> {
public:
const T& get()const { return value; }
void set(const T& v){ value = v; }
};
template<typename T> class property<const T> : public base_property<T> {
public:
const T& get()const { return value; }
};
class ConstChild : public property<const int>{ };
У меня есть трюк, а не чистое решение.
class ConstChild : private Property
{
operator const Property () { return *this; }
};
, затем
ConstChild cc;
cc.set(10); // ERROR
cc().get();
warning: conversion function converting 'ConstChild' to its base class 'Property' will never be used
. Тогда ConstChild не предоставляет operator()
, поэтому cc()
недействителен. Предположительно cc.operator const Property().get()
будет, и в этом случае operator const Property&
будет иметь больше смысла. Даже тогда синтаксис уродлив. Единственное, что имеет смысл, это объявить using Property::get
внутри ConstChild
.
– alfC
8 January 2018 в 03:21
У меня возникла необходимость в связанной проблеме, которая заключается в том, чтобы действительно контролировать / выделять изменяемый и const-доступ для некоторого класса. Я сделал это с помощью этой простой многоразовой обертки шаблона:
template <typename T>
class TAccessor : private T
{
public:
const T& Const() const { return *this; }
T& Mutable() { return *this; }
};
// Example of use:
template <typename T>
using MyVector = TAccessor<std::vector<T>>;
void main()
{
MyVector<int> vector;
vector.Mutable().push_back(10);
int x = vector.Const()[1];
...
}
Если вы создаете функцию const
члена set
, вы получите то, что вам нужно.
class Property
{
int get() const;
void set(int a);
};
class ConstChild : public Property
{
void set(int a) const {}
};
Единственное предостережение в том, что хитрый пользователь может обойти ваше намерение, используя:
ConstChild child;
child.set(10); // Not OK by the compiler
Property& base = child;
base.set(10); // OK by the compiler
A::set()
& quot; на самом деле означало «может называть это, но ничего не происходит» ... что я сомневаюсь. Можно было бы подумать, что они действительно означают, что он не может быть вызван, т. Е. Он будет генерировать ошибку компиляции, как и любую попытку вызвать метод non const
в виде реального объекта const
, к которому они обратили аналогию.
– underscore_d
28 June 2016 в 21:46
ConstChild
сам const
, я мог бы вызвать его метод set
, который заставил бы его выглядеть так, будто он на самом деле что-то делает, а это не так. В идеале строка Property& base = child;
вызовет ошибку компилятора, поскольку она пытается отбросить const
.
– Martin Darterson
28 June 2016 в 21:49
Я хотел бы наследовать от класса с помощью спецификатора const
blockquote>. Как бы вы ни хотели, это не имеет значения. Вы не можете. Это недопустимо C ++.
Можно ли каким-либо образом использовать ключевое слово const для наследования? "
blockquote>No.
Внести изменчивость позже в ваше дерево наследования и получить соответствующий результат:
class Property
{
int get() const;
};
class MutableProperty : public Property {
{
void set(int a);
};
И затем:
class ConstChild : public Property { ... };
class MutableChild : public MutableProperty { ... };
ReadOnlyProperty
, что и есть то, что есть, просто с разными именами.
– Martin Darterson
28 June 2016 в 21:51
Property
также был бы ReadOnlyProperty
, хотя он не был бы прочитан. В конце концов, я боюсь, что вы действительно просите о новой языковой функции. И неразумно представить, что все модификаторы, разрешенные для регулярных членов, также идут с суперклассами.
– Thomas B Preusser
29 June 2016 в 06:08