我如何从另一个类的基类中获取派生类中的受保护成员

时间:2019-04-13 11:18:14

标签: c++

我正在尝试实现一个从另一个类队列派生的双端队列,另一个队列是名为Node的类的朋友。在类节点中,我将info和* next设置为私有,将public和set和get函数设置为

在队列类中,我有一个指向第一个节点的指针prim和一个指向最后一个节点的ultim指针(均受保护)+ set和get函数。 当我尝试在派生类中使用setPrim时,问题就来了。我收到一个编译器错误“类节点”,没有名为“ setPrim”的成员。

为什么会发生这种情况,我该如何解决?

class node
{
protected:
    char info;
    node *next;
public:
    node()
    {
        next=NULL;
    }
    ~node()
    {
    }
    char getInfo()
    {
        return info;
    }
    node* getNext()
    {
        return next;
    }
    void setInfo(char x)
    {
        info=x;
    }
    void setNext(node* x)
    {
        next=x;
    }
    friend class Queue;
    };
class Queue
    {
    protected:
    node *prim;
    node *ultim;
public:
    char aux;
    int dim_max;
    Queue(int maximuml)
    {
        prim=NULL;
        ultim=NULL;
        dim_max=maxim;
    }
    virtual ~Queue()
    {
        delete []prim;
        delete []ultim;
    }
    node* getPrim()
    {
        return prim;
    }
    node* setPrim(node *x)
    {
        prim=x;
    }
    node* getUltim()
    {
        return ultim;
    }
    node* setUltim(node *x)
    {
        ultim=x;
    }
    void print()
    {}
    virtual void push(char x)
    {}
    virtual void pop()
    {}
}
class Deque: public Queue
{
public:
    Deque(int maximum,int maxi):Queue(maximum)
    {
        ___prim->setPrim();___
        ultim=NULL;
        dim_max=maxi;
        cnt=0;
    }
    ~Deque()
    {
       delete []prim;
       delete []ultim;
    }
    void push(char x,int ok)
    {}
    void pop(int ok)
    {}
};

3 个答案:

答案 0 :(得分:1)

prim的类型为node。然后,您可以这样做:

prim->setPrim();

但是node类没有名为setPrim()的函数。具有Queue函数而不是setPrim()的{​​{1}}类。您是不是要这样做?

node

此外,尽管与您的问题无关,您的setPrim(prim); 析构函数也会删除Dequeprim,而ultim析构函数将再次删除它们。请勿多次删除同一对象。另外,Queue仅应用于使用delete[]分配的事物。

答案 1 :(得分:0)

在C ++中,友谊不是继承的。从standard

  

友谊既不是继承也不是传递。

class A {
  friend class B;
  int a;
};

class B {
  friend class C;
};

class C  {
  void f(A* p) {
    p->a++;         // error: C is not a friend of A despite being a friend of a friend
  }
};

class D : public B  {
  void f(A* p) {
    p->a++;         // error: D is not a friend of A despite being derived from a friend
  }
};

答案 2 :(得分:0)

我实际上在移动设备中,但是如果我的“思维编译器”工作正常,则可以使用CRTP(好奇地递归模板模式)。尝试类似以下代码的内容:

template<typename Derived>
class Base : public Derived {
     void print() {
          return reinterpret_cast<Derived>(this).print();
     }
};
class foo : public Base<foo> {
      void print() {
          std::cout<<"Hello from foo";
      }
};

我希望它对您有用