2015-11-14 4 views
1

В настоящее время я разрабатываю класс, который будет ссылаться на данные другого объекта. В этом новом классе я пытаюсь передать ссылку на объект, чтобы новый класс мог просматривать значения объекта без необходимости копировать исходные данные объекта. Однако я борюсь с этим.C++ Передача объекта Object Reference Into Constructor

настоящее время у меня следующий класс прототип:

Force2Motion(const RigidBody& rigid_body); 

Так что, когда я прохожу эту ссылку в конструктор, я хотел бы сохранить это для будущего использования после того, как объект был инициализирован. Таким образом, я хочу каким-то образом сказать

RigidBody _memberObject = rigid_body; 

Однако, я хочу, чтобы избежать копирования всех rigid_body в свой собственный объект. Вместо этого, я подумал, что было бы более уместно сделать что-то вроде этого

// Force2Motion Member Object 
RigidBody& _rigidBody; 

А потом во время создания объекта имеет следующий конструктор

Force2Motion(const RigidBody& rigid_body): 
    _rigidBody(rigid_body) 

Однако это выдает ошибку о том, что я не разрешено назначать ссылку на ссылку const. Я хочу убедиться, что этот новый класс не переназначает ссылку на конструктор, поэтому я считаю, что мне нужен const.

Я понял, что если бы я инициализировал объект-член в качестве ссылки на константу, это позволило бы мне запустить конструктор в порядке, но тогда я не мог использовать какие-либо из функций-членов объектов, потому что компилятор думал, что доступ к функция-член могла бы изменить данные исходной ссылки на объект.

Такое, что у меня есть:

const RigidBody& _rigidBody; 

с конструктором

Force2Motion(const RigidBody& rigid_body): 
     _rigidBody(rigid_body) 

Есть ли изменения, которые могут быть сделаны в Rigidbody классе таким образом, что я все еще могу использовать функции-члены, даже если я объявлен объект как const? Как и в, могу ли я отметить определенные функции, чтобы они указывали, что доступ к ним не изменит никаких данных внутри объекта?

Спасибо за помощь!

Редактировать: В моем процессе описания проблемы я понял реальный вопрос, в котором я должен был спрашивать. Таким образом, я легко мог найти вопрос. Проверьте это link. В нем объясняется, что если вы инициализируете объект как const, вы не сможете получить доступ к какой-либо функции-члену этого объекта, поскольку доступ к функциям-членам может изменить данные в объекте, который был определен как const. Таким образом, если у вас есть функция-член, которую вы ЗНАЕТ, не измените данные объекта, вам нужно пометить эту функцию с помощью ключевого слова const (обратитесь к ссылке для уточнения). Это позволит вам объявить объект как const, но все же иметь доступ к определенным функциям-членам.

ответ

2

Да, вы можете. Функции-члены могут быть Const

void myFunction() const; 

Используя этот const делает this указатель сопзЬ, таким образом, означает, что вы не можете изменять переменные-члены или вызывать другие, не константные члены-функции.Есть некоторые исключения из этого, например const_cast и ключевое слово mutable. Но этого, вероятно, следует избегать.

Хороший, простой пример использования const на геттерах.

int getSize() const 
{ 
    return size; 
} 

Поскольку ничего не изменится, эту функцию можно вызывать на объекте const или не const.

Смежные вопросы