Я писал общую библиотеку на C ++, но я хочу поделиться некоторыми экземплярами класса с помощью пользователей библиотеки. Я имею в виду, объект только для чтения, загруженный всего один раз из библиотеки и используемый каждым процессом, связанным с библиотекой.
Насколько я знаю, это можно сделать с помощью const
или же static const
, но это не работает, как ожидалось.
Например:
#include <iostream>
static const int x = 1;
int main()
{
std::cout << x << std:endl;
*(const_cast<int *>(&x)) = 2;
std::cout << x << std:endl;
return 0;
}
Используя GCC 4.8.1, код хорошо компилируется, но, очевидно, он не работает во время выполнения, потому что x
переменная только для чтения (она вызывает ошибку сегментации в моем Linux).
Тем не менее, давайте посмотрим на этот код:
#include <iostream>
struct A
{
A() : x(1) {}
int x;
}
static const A a;
int main()
{
std::cout << a.x << std:endl;
const_cast<A *>(&a)->x = 2;
std::cout << x << std:endl;
return 0;
}
Последний код компилируется и работает хорошо. Исполняемые отпечатки
1
2
Я был в состоянии изменить данные const! Поэтому я думаю, что модификатор const НЕ работает должным образом с классами.
Тогда мои вопросы:
const static
модификаторы делают для экземпляра класса?Класс, который я хочу создать, наследует от абстрактного.
Я использую C ++ 11, но показанные ранее коды были протестированы без поддержки C ++ 11.
извините, если я допустил ошибку на английском
Статические переменные не распределяются между процессами. Каждый процесс получает свой собственный сегмент данных, в который помещаются переменные. Неважно, являются ли они const
или нет.
О const_cast
Вы, кажется, смущены тем, для чего это на самом деле. Это в состоянии удалить const
атрибут из любой переменная. Весь смысл в том, чтобы компилятор разрешил запись в const
переменная. Вы можете использовать это на чем угодно, и вы делаете это на свой страх и риск. Если вы лишите const
из чего-то, что действительно не доступно для записи, вы в неопределенном поведении.
const static
переменная имеет обычное значение. Это статично и постоянно. Тип не имеет значения; const static int
или же const static A
, Означает одно и то же для обоих.
Если вы хотите разделить объект между процессами, вам нужно будет поместить его в общую память POSIX и синхронизировать доступ к нему. Вы используете shm_open () для этого. Есть несколько уроков по общей памяти онлайн, например этот например.
Других решений пока нет …