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