Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从属于另一个类的基类访问派生类中的受保护成员_C++ - Fatal编程技术网

C++ 如何从属于另一个类的基类访问派生类中的受保护成员

C++ 如何从属于另一个类的基类访问派生类中的受保护成员,c++,C++,我试图实现一个deque,它是从另一个类队列派生的,该类队列是名为Node的类的朋友。在类节点中,我将info和*next设置为private,将set和get函数设置为public 在队列类中,我有一个指向第一个节点的指针prim和一个指向最后一个节点的ultim指针(两者都受保护)+set和get函数。 当我尝试在派生类中使用setPrim时,问题就出现了。我发现编译器错误“类节点”没有名为“setPrim”的成员 为什么会发生这种情况?我如何修复它 class node { protect

我试图实现一个deque,它是从另一个类队列派生的,该类队列是名为Node的类的朋友。在类节点中,我将info和*next设置为private,将set和get函数设置为public

在队列类中,我有一个指向第一个节点的指针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)
    {}
};

<> C++中的友情不是继承的。从

友谊既不是继承的,也不是传递的


prim
属于
node
类型。然后你会:

prim->setPrim();
但是
节点
类没有名为
setPrim()的函数
。是
队列
类具有
setPrim()
函数,而不是
节点
。你是不是打算这样做

setPrim(prim);

此外,尽管与您的问题无关,您的
Deque
析构函数会删除
prim
ultim
,它们将被
队列
析构函数再次删除。不要多次删除同一对象。另外,
delete[]
应该只用于使用
new[]

分配的东西,我实际上在手机里,但如果我的“思维编译器”工作正常,你可以使用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";
      }
};
模板
类基:公共派生{
作废打印(){
返回reinterpret_cast(this.print();
}
};
foo类:公共基础{
作废打印(){

std::cout只是一个旁注…绝对没有必要存在
getInfo
setInfo
getNext
、和
setNext
。它们只会使代码膨胀。其他类中的简单getter/setter也是如此。我非常确定,您无法将其缩小到此处所需的范围。编译器错误确实是因为“类节点”没有名为“setPrim”的成员。队列类有该方法,您可以调用
this->setPrim()
或只调用
setPrim()
。另外,您不应该使用
~Deque
析构函数,因为这些成员已经在基类
队列中被删除了
析构函数似乎误解了标题中的问题,这就回答了问题。我想补充一点关于双重删除的评论on@A.H.是的。谢谢。非常感谢!我明白我做错了什么。我知道了实际设置初始值(NULL);
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";
      }
};