2011-12-21 2 views
1

У меня есть одноэлементный класс с переменной, которую будет использовать каждый экземпляр класса. Теперь я хочу поместить функцию в мой одноэлементный класс, скажем, «GetReference».const указатель возвращает ссылку

  1. Возможно ли вернуть ссылку на переменную? Если да, то как я могу вернуть ссылку на переменную?
  2. Как заставить других использовать, а не изменять или удалять переменную. Будет ли const работать на мой случай?

ответ

2

1) Для того, чтобы вернуть ссылку на переменную, используйте этот вид синтаксиса:

int& getARefOnDummy() 
{ 
    return dummy; 
} 

2) Для того, чтобы вернуть константный реф (что не сможет быть изменен или удален), использование этот вид синтаксиса:

const int& getARefOnDummy() 
{ 
     return dummy; 
} 
0

модификатор const будет работать для вас. В следующем примере экземпляр/статическая переменная x не может быть изменена ничем, вызывающим getReference.

const int& Singleton::getReference() const 
{ 
    return x; 
} 
0

Строго говоря, константный модификатор может быть вытеснен и изменен. Возврат по значению является более безопасным и лучшим выбором, чем ссылка на внутреннюю переменную.

Если возврат по стоимости дорог (например, объект большого класса возвращается), шаблон делегирования может использоваться с простым классом-оболочкой и частной ссылкой на реализацию.

0

Вы можете вернуть ссылку, но только если она является статикой или частью объекта (то есть нет локальной переменной).

Вы также можете возвращать ссылку на объект класса:

class Singleton 
{ 
private: 
    static Singleton *singleton = 0; 
    Singleton() // making the constructor private keeps others from creating their own instance 
    { 
    } 

    ~Singleton() // making the destructor private keeps others from destroying their instance on their own 
    { 
    } 
public: 
    static Singleton *GetPtr(void) 
    { 
     if(!singleton) 
      singleton = new Singleton(); 
     return singleton; 
    } 

    static Singleton &GetRef(void) 
    { 
     return *GetPtr(); // dereference the pointer 
    } 

    static void Free(void) 
    { 
     if(!singleton) 
      return; 
     delete singleton; 
     singleton = 0; 
    } 
} 

Вы могли бы и вернуть константный указатель и/или ссылки, в зависимости от того, что вы хотите сделать с классом (как я не знаю, хотите ли вы просто запретить другим пользователям удалять или изменять). Просто имейте в виду, что есть способы обмануть это (const_cast<>()).

0
#include <stdio.h> 
using namespace std; 
//This is the class, which I want to keep others to delete or modify 
class Ref{ 
public: 
    int X; 
}; 


class SingleTon{ 

private: 
    static Ref reference; 
public: 
    SingleTon(){ 
    // reference = new Ref(); 
    } 
    static const Ref& getReference(){return reference;} 
}; 

int main(){ 
    Ref * ptr = SingleTon::getReference(); 
} 

Если я говорю Синглтон :: getReference(), я должен получить Refernce из класса Ref, так что все только должны использовать его, но не изменять содержимое или удалить указатель.

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