2016-03-16 4 views
0

Если у меня есть классОшибка вызова внешней функции аксессора

Class A 
{ 
    public: 
     UINT getfoo(); 

... other stuff ... 

    private: 
     UINT initfoo (data); 
     UINT foo; 

    ... other stuff ... 
} 

Идея заключается в том, в конструктор класса, я поставил

foo = initfoo (data); 

getfoo простой возврат Постулаты

UNIT getfoo() 
{ 
    return foo; 
} 

Затем из внешней функции, где у меня есть экземпляр этого класса, я использую функцию доступа getfoo, чтобы получить значение foo в этом классе.

A a; 
UINT myfoo; 
... 
myfoo = A::getfoo 
-or- 
myfoo = a.getfoo 

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

Использование A :: VS2013 дает мне ошибку в редакторе

A value of type UINT (A::*)() cannot be assigned to an entity of type UINT

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

error C2440: '=' : cannot convert from 'unsigned int (__thiscall A::*)(void)' to 'unsigned int'

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

ответ

2

Ваш вызов функции должен быть таким:

myfoo = a.getfoo(); 

Кроме того, это не нормально для мутатор возвращать значение, так

UINT initfoo (data); 

, вероятно, следует

void initfoo (data); 

Также рекомендуется придерживаться следующих соглашений об именах для аксессуаров/мутаторов:

UINT foo; 
UINT getFoo(); 
void setFoo(UINT val); 

EDIT с сопзЬ например:

class A 
{ 
public: 

    // Initialise foo to some random number 
    A() 
    : foo(4U) 
    { 
    // constructor body here 
    } 

private: 
    // Once initialised foo cannot change during the lifetime of this object 
    const UINT foo; 
}; 

Для ясности я написал заявление и реализацию вместе. Если вы разделите его на .h/.cpp, список intitialiser появится в .cpp с определением конструктора

+0

Wow. Круглые скобки. Я новый, это было что-то очевидное. Я чувствую себя глупо, задавая вопрос сейчас, но спасибо за быстрый ответ. – Trashman

+0

Я не проектировал initfoo как мутатор. Он просто возвращает начальное значение для foo на основе данных. Моя функция-конструктор инициализирует foo значением из initfoo и никогда не касается foo снова. Мое понимание - это мутаторы, которые обычно используются при вызове из внешней функции, чтобы попытаться изменить значение в классе. Как только foo установлен в конструкторе, я не хочу его снова изменять, поэтому я не использую мутатор. Я здесь не так? – Trashman

+0

Нет, это звучит нормально, но может быть лучший способ добиться этого. Если вы действительно не хотите, чтобы член класса изменился, вы можете обеспечить его выполнение, сделав его «const» и инициализируя его в списке инициализаторов конструкторов. Я добавлю пример ответа. – rcs

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