我正在尝试实现一个从另一个类队列派生的双端队列,另一个队列是名为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)
{}
};
答案 0 :(得分:1)
prim
的类型为node
。然后,您可以这样做:
prim->setPrim();
但是node
类没有名为setPrim()
的函数。具有Queue
函数而不是setPrim()
的{{1}}类。您是不是要这样做?
node
此外,尽管与您的问题无关,您的setPrim(prim);
析构函数也会删除Deque
和prim
,而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";
}
};
我希望它对您有用