c ++ указатель на проблему члена класса const - PullRequest
1 голос
/ 12 октября 2010

У меня проблема с классами C ++. Я хотел бы получить указатель на myBar объект и сохранить его в quxBar. Причина в том, что я хотел бы иметь возможность проверить значение с помощью quxBar->getX(), но я также хотел бы предотвратить случайное изменение его из Qux, поэтому я попытался использовать Bar const*.

class Bar
{
private:
    int x;
public:
    void setX(int X) { x = X; };
    int getX(){ return x };
}

class Foo
{
private:
    Bar *myBar;
public: 
    Bar const* getPointerToBar(){ return myBar; };            
}

class Qux
{
    void myMethod();
    Bar const* quxBar;
    Foo *mainFoo;    
}

void Qux::myMethod()
{
    quxBar = mainFoo->getPointerToBar();
    std::cout << quxBar->getX();
    quxBar->setX(100);  // HERE!!!
    std::cout << quxBar->getX(); // returns 100
}

К сожалению, это не работает, так как я все еще могу выполнить quxBar->setX(100) без ошибки компиляции.

Возможно, мой подход совершенно неправильный, но я использую текущие "навыки" :) Я понятия не имею, как это исправить.

Заранее благодарим за любую помощь и предложения.

1 Ответ

7 голосов
/ 12 октября 2010

Я не думаю, что это ваш настоящий код, во-первых, из-за синтаксических ошибок, которые он имеет, а во-вторых, из-за того, что он на самом деле правильный (в основном).Более конкретно, с этим фрагментом кода quxBar->setX(100); приведет к ошибке компиляции.

Однако quxBar->getX() также будет ошибкой компиляции, вам нужно указать компилятору, что он может быть вызван для const-объектов,Вы делаете это, добавляя const в конце сигнатуры функции:

int getX() const { return x; }

Возможно, в вашем фактическом коде у вас было Bar* const quxBar вместо Bar const* quxBar;они означают две разные вещи: первая - это const-указатель на Bar, а вторая - указатель на const Bar .Например.в предыдущем случае только сам указатель не может быть изменен, но объект, на который он указывает, может.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...