2013-04-12 2 views
0

У меня есть 4 класса.Классы и чистые виртуальные

class A, class B, class C, class D

Класс C включает в себя класс A и класс B и ссылки на них:

Заголовок файла:

class C 
{ 
private: 
    A &a; 
    B &b; 
    int x; 
    int y; 
    int energy; 
public: 

    C(A &a, B &b); 

      void print(void); 

    virtual void printAt(void); 

CPP файл включает в себя:

void C::printAt(void) 
{ 
    // move cursor to the current x, y coordinates 
    b.gotoXY(x,y); 
} 

В классе D я сделать класс C другим класса по формуле (class D : public class C...)

Тогда у меня есть void printAt(void).

Все это работает, но как мне получить доступ к атрибутам класса b (b.gotoXY..) из класса D?

Надеюсь, это делает Sence.

+2

Вы не делаете его _ «друг» _, вы унаследовали от него. –

+2

Перейдите к [inheritance] (http://stackoverflow.com/a/860353/57318) и [общедоступный/защищенный/закрытый доступ] (http://stackoverflow.com/a/614844/57318). Мы можем ответить на это за вас, но я боюсь, что вы не поймете, почему. – Xymostech

ответ

0

Просто поместите их в protected разделе:

class C { 
protected: 
    A &a; 
    B &b; 

    ... 
}; 

Примечание: Это не имеет ничего общего с virtual методами.

0

Причина, по которой вы не можете войти в систему от D, состоит в том, что они private, а это значит, что они доступны только с точностью до D. Для того, чтобы иметь возможность получить доступ к ним только из D или его подклассов, вам нужно использовать модификатор protected доступа вместо:

class C 
{ 
private: 
    int x; 
    int y; 
    int energy; 

protected: 
    A &a; 
    B &b; 

public: 
    C(A &a, B &b); 

    void print(void); 

    virtual void printAt(void); 
    /// ... 
}; 

Теперь немного терминологии:

При вводе class C : public D вы не сделав его friend, вы наследуете его. Это означает, что C будет базовым классом D. Друг - это другая, связанная концепция.

Друг какого-то класса - это еще один класс, который имеет доступ к своим private свойствам. Итак, если вы вместо этого сделали D a friend из C, у вас был бы доступ к a и b, не делая их protected. Это можно было бы осуществить, как, например:

class C 
{ 
    // Some code... 
    friend D; 
    //Lots of code ... 
} 

Пожалуйста, обратите внимание, что для этой работы, вы должны объявить D перед тем C.

Теперь, какой из этих вариантов вы должны использовать?

Задайте себе этот вопрос: D логически более конкретный тип C? Если это так, он должен использовать наследование.Если нет, то может быть лучше сделать D членом категории C и использовать ключевое слово friend. В любом случае, используйте friend экономна, и только если есть обязательно очень тесная взаимосвязь между этими двумя классами (возможно, если D является заводом по типу C и C имеет частный конструктор.)

0

Вы должны сделать намеченные член protected или сделать свои классы friend вашему классу.

Кроме того, я чувствую, что возникнет проблема при создании объекта с C из-за неинициализированных ссылок.

class C 
{ 
private: 
    A &a; 
    B &b; 

    // ... 

public: 
    C(A &a, B &b) : a(a), b(b) 
        ^^^^^^^^^^^^ 
    // ... 
}; 
0

когда вы хотите другой класс в наследует доступ к вашим атрибутам .dont частным их
поэтому вы можете выбрать защищенные или общественность. более подробно вы можете пойти http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/
для решения проблемы попробуйте ниже кода

class C 
{ 
protected://or public 
    A &a; 
    B &b; 
    int x; 
    int y; 
    int energy; 
public: 
    C(A &a, B &b); 
    void print(void); 
    virtual void printAt(void); 

и в class D

class D:public C 
{ 
public: 
    void printAt(void); 
};