Предположит, что у меня есть свои классы как:Установка для чтения свойства из другого класса
namespace scope
{
class A
{
private:
int a;
public:
...
};
class B
{
public:
...
A method();
...
};
};
определение метода:
A B::method()
{
A object;
object.a = 3; // private member access error
// access via object (pointer) error if inheritance is used
return object;
}
Наиболее распространенный способ решить ошибку доступа является использование сеттеров + добытчиков.
Однако я не хочу, чтобы какой-либо другой ресурс (или кто-то из API) устанавливал A.a
, поэтому для этого случая запрещено использование общего метода set .
может быть общедоступным, но он должен быть доступен только для чтения со стороны API. Он должен быть читать + писать со стороны источника, потому что, например, я хочу установить его с помощью B::method
. Как я могу достичь такого поведения?
Я пробовал наследование, а также отношение друзей. Я также играл с immutable
и const
объявлениями о собственности. Проблема с ними заключается в том, что когда я объявляю объект A со стандартным конструктором, для свойства задано некоторое значение, например -918316838410 (что может возникнуть из-за того, что я не использую extern
, я не уверен) и не может быть установлен по method
позже.
Любые идеи будут оценены. Заранее спасибо.
Идеи 1, определить 'A' с открытым конструктором' explicit', который принимает 'int'. Идея 2, сделайте 'B' другом' A'. Вы говорите, что вы попробовали «друг», но я подозреваю, что вы не очень старались. –
Конструкция по умолчанию для int - неопределенное значение. Если вы хотите что-то еще, добавьте соответствующие конструкторы. (например, конструктор no-arg, который устанавливает хорошее значение, или конструктор int, который принимает аргумент и использует его). Что касается явной, его ненужной, но часто хорошей идеи для конструктора с одним аргументом, чтобы избежать непреднамеренного автоматического преобразования – RichardPlunkett