2015-11-06 2 views
0

Я новичок в C++ и мне нужно прочитать из частных членов класса класса в методе, которая находится в другом классе, например:Read частных членов переменного класса

class a{ 
private: 
int x; 

} 

class b{ 
void foo(); 
} 

void b::foo(){ 
//here I want to read from x that's in a 
} 

Должен ли я установить в функции class a, как int readx(){return x);) или a readclass(){return *this);}? Есть ли другой способ?

+0

вы можете использовать функцию друга, которая может получить доступ к x. –

+3

Вы должны подумать, что это, вероятно, объявлено приватным по причине. –

+0

@NeilKirk: правый, например. если бы разработчик класса имел в виду возможность продлить его позже для использования в многопоточной среде, где неаудированный доступ к данным является игровым убийцей. –

ответ

3

Частный раздел класса имеет цель «скрываться», как вы обрабатывать данные, обеспечивая упорядоченный способ экранного указанных данных с открытыми методами. Преимущество использования общедоступного метода для изменения значения частных членов заключается в том, что вы можете, например, разрешать значения только от 0 до 10 для «x».

В вашем случае вы должны подумать о том, что означает «x» в вашем первом классе, и если имеет смысл для второго класса обращаться к нему напрямую и без какого-либо контроля или специального рассмотрения. Если это так, это, вероятно, должно быть общедоступным. В другом случае вам нужно будет сделать общедоступный метод для его чтения, например, вашего примера readx. Если только «b» имеет привилегию получить доступ к «x» напрямую, вы также можете определить функцию друга, как, например, кто-то уже сказал.

Обратите внимание, что возврат указателя на экземпляр не позволит получить доступ к закрытым членам класса.

1

Вы можете использовать класс или функцию друга, но плохая идея использовать частные члены методов (тесты - лишь разумное оправдание). Лучше использовать общедоступные методы для этого или перепроектировать ваш код, если вы не можете избежать использования частных членов.

1

Вы можете реализовать функцию друга, которая может получить доступ к x в foo.

Reference

+0

Вы должны написать больше, чем это, потому что ссылка может исчезнуть в будущем. –

1

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

Например

#include <iostream> 

class B 
{ 
public:  
    void foo() const; 
}; 

class A 
{ 
public: 
    A(int x) : x(x){} 
private:  
    friend void B::foo() const; 
    int x; 
}; 

void B::foo() const 
{ 
    A a { 10 }; 
    std::cout << a.x << std::endl; 
} 

int main() 
{ 
    B().foo(); 

    return 0; 
} 
+0

': x (x) {}' Что это? – shinzou

+0

@kuhaku Это так называемая инициализация ctor. Выражение x (x) после двоеточия инициализирует элемент данных x значением параметра x. –

1

Объявление friend функции или классом будет предоставлять доступ к чтению и через е е к этой функции или классу писать, а

class a { 
public: 
    const int& readx() const { return x; } 
private: 
    int x 
}; 

или, если вам нравится, что семантика лучше

class a { 
public: 
    const int& x() const { return x_; } 
private: 
    int x_; 
}; 

гранты чтение доступ только для каждого клиента.

+0

Почему const перед именем функции? – shinzou

+0

@kuhaku первый 'const' для обеспечения доступа только для чтения (ум - это ref, а не возвращаемое значение), а второй - для вызова его на экземплярах' const a'. Помимо этого одно общее правило в C++ (и C) - это идиома ** 'const as const can' ** - то, что не должно быть изменчивым, всегда должно быть объявлено как таковое -' const', что , –

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