Поздно на вечеринке, но недавно я столкнулся с этой проблемой, и мне пришлось что-то делать в соответствии с: -
class RandomObject {
RandomObject(this.x, this.y);
RandomObject.clone(RandomObject randomObject): this(randomObject.x, randomObject.y);
int x;
int y;
}
Затем, вы можете просто вызвать копию с оригиналом, например так: -
final RandomObject original = RandomObject(1, 2);
final RandomObject copy = RandomObject.clone(original);
Прокси-сервер - это класс, который предоставляет модифицированный интерфейс для другого класса.
Вот пример - предположим, у нас есть класс массива, который мы хотим содержать только двоичные цифры (1 или 0). Вот первая попытка:
struct array1 {
int mArray[10];
int & operator[](int i) {
/// what to put here
}
}; `
Мы хотим, чтобы оператор []
выдавал, если мы говорим что-то вроде a [1] = 42
, но это невозможно, потому что только этот оператор видит индекс массива, а не сохраняемое значение.
Мы можем решить эту проблему с помощью прокси:
#include <iostream>
using namespace std;
struct aproxy {
aproxy(int& r) : mPtr(&r) {}
void operator = (int n) {
if (n > 1 || n < 0) {
throw "not binary digit";
}
*mPtr = n;
}
int * mPtr;
};
struct array {
int mArray[10];
aproxy operator[](int i) {
return aproxy(mArray[i]);
}
};
int main() {
try {
array a;
a[0] = 1; // ok
a[0] = 42; // throws exception
}
catch (const char * e) {
cout << e << endl;
}
}
Прокси-класс теперь проверяет двоичную цифру, и мы выполняем оператор массива []
возвращает экземпляр прокси, который имеет ограниченный доступ к внутренним компонентам массива.
Вот пример - предположим, у нас есть класс массива, который мы хотим содержать только двоичные цифры (1 или 0). Вот первая попытка:
struct array1 {
int mArray[10];
int & operator[](int i) {
/// what to put here
}
}; `
Мы хотим, чтобы оператор []
выдавал, если мы говорим что-то вроде a [1] = 42
, но это невозможно, потому что только этот оператор видит индекс массива, а не сохраняемое значение.
Мы можем решить эту проблему с помощью прокси:
#include <iostream>
using namespace std;
struct aproxy {
aproxy(int& r) : mPtr(&r) {}
void operator = (int n) {
if (n > 1 || n < 0) {
throw "not binary digit";
}
*mPtr = n;
}
int * mPtr;
};
struct array {
int mArray[10];
aproxy operator[](int i) {
return aproxy(mArray[i]);
}
};
int main() {
try {
array a;
a[0] = 1; // ok
a[0] = 42; // throws exception
}
catch (const char * e) {
cout << e << endl;
}
}
Прокси-класс теперь проверяет двоичную цифру, и мы выполняем оператор массива []
возвращает экземпляр прокси, который имеет ограниченный доступ к внутренним компонентам массива.
Вот пример - предположим, у нас есть класс массива, который мы хотим содержать только двоичные цифры (1 или 0). Вот первая попытка:
struct array1 {
int mArray[10];
int & operator[](int i) {
/// what to put here
}
}; `
Мы хотим, чтобы оператор []
выдавал, если мы говорим что-то вроде a [1] = 42
, но это невозможно, потому что только этот оператор видит индекс массива, а не сохраняемое значение.
Мы можем решить эту проблему с помощью прокси:
#include <iostream>
using namespace std;
struct aproxy {
aproxy(int& r) : mPtr(&r) {}
void operator = (int n) {
if (n > 1 || n < 0) {
throw "not binary digit";
}
*mPtr = n;
}
int * mPtr;
};
struct array {
int mArray[10];
aproxy operator[](int i) {
return aproxy(mArray[i]);
}
};
int main() {
try {
array a;
a[0] = 1; // ok
a[0] = 42; // throws exception
}
catch (const char * e) {
cout << e << endl;
}
}
Прокси-класс теперь проверяет двоичную цифру, и мы выполняем оператор массива []
возвращает экземпляр прокси, который имеет ограниченный доступ к внутренним компонентам массива.
Прокси-класс позволяет вам скрыть личные данные класса от клиентов этого класса.
Предоставление клиентам вашего класса прокси-класса, который знает только общедоступный интерфейс вашего класса, позволяет клиентам использовать службы вашего класса, не предоставляя клиенту доступа к деталям реализации вашего класса.