Доступ к статической переменной из функции друга - PullRequest
2 голосов
/ 02 февраля 2011
class Base
{
private:
    static int num; 
public:
    friend void setnum(Base obj); 
};

void setnum(Base obj)
{
    obj.num=4;  /* Error */
}

Предполагается, что у функции-друга есть доступ ко всем частным данным класса.что мне здесь не хватает?Кажется, я не могу получить доступ к статической переменной из функции друга.

Ошибка кодовой панели -> В функции setnum(Base)': undefined reference to Base :: num '

Ошибка Visual Studio -> ошибка LNK2001: неразрешенный внешний символ "private: static int Base:: num "

Ответы [ 5 ]

4 голосов
/ 02 февраля 2011

Ваша свободная функция называется setvals, но функция друга Base называется setnum ...

Кроме того, вам придется фактически определять статическую переменную, а не просто объявитьit.

Поместите:

int Base::num;

в исходный файл.

2 голосов
/ 02 февраля 2011

Вы объявили только статическую переменную num. Вы должны определить это:

class Base
{
private:
    static int num; 
public:
    friend void setvals(Base obj); 
};

// This must be in a .cpp
int Base::num;

void setvals(Base obj)
{
    obj.num=4;
}

Этот код работает.

Edit:

На самом деле вы можете реализовать функцию setvals() следующим образом:

void setvals()
{
    Base::num=4;
}

А на вашем Базовом классе:

friend void setvals(); 

Потому что num является статическим.

0 голосов
/ 02 февраля 2011

В C ++ недостаточно объявить статическую переменную в .h;Вы также должны определить это явно в .cpp.Вы должны добавить в .cpp реализации

int Base::num;

То, что вы получили, было ошибкой компоновщика из-за этого отсутствующего определения переменной.

0 голосов
/ 02 февраля 2011

Разные друзья:

friend void setnum(Base obj); 
         //    ^^^  Not the same as vals!
       void setvals(Base obj)
0 голосов
/ 02 февраля 2011

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

...