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.gotoXY..从 class 访问 b 类属性()D

希望这可以使 Sence。

4

4 回答 4

0

只需将它们放在protected部分中:

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

  ...
};

注意:virtual它与方法无关。

于 2013-04-12T15:24:18.380 回答
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您没有将其设为 a friend,而是从它继承。这意味着C将是D. 朋友是另一个相关的概念。

某个类的朋友是另一个可以访问其private属性的类。因此,如果您改为制作Da friendof C,您将可以访问ab无需制作它们protected。这将是这样完成的:

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

请注意,要使其正常工作,您需要先D声明C.

现在,您应该使用哪些选项?

问自己这个问题:D逻辑上是更具体的类型C吗?如果是这样,它应该使用继承。如果没有,最好让D一个成员类型C并使用friend关键字。在任何一种情况下,friend都要谨慎使用,并且仅当两个类之间必然存在非常紧密的关系时(也许如果D是类型的工厂C并且C具有私有构造函数。)

于 2013-04-12T15:38:04.023 回答
0

您应该将预期的成员protected或将他们的课程friend添加到您的课程中。

另外,我觉得你在实例化一个对象时会C因为未初始化的引用而遇到问题。

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

    // ...

public:
    C(A &a, B &b) : a(a), b(b)
                  ^^^^^^^^^^^^
    // ...
};  
于 2013-04-12T15:38:18.680 回答
0

当您希望其他类继承对您的属性的访问权限时。不要将它们私有化,
以便您可以选择受保护的或公共的。有关更多详细信息,您可以访问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);
};
于 2013-04-12T15:40:00.793 回答