gpt4 book ai didi

c++ - const 指针作为构造函数参数

转载 作者:行者123 更新时间:2023-11-27 23:35:23 31 4
gpt4 key购买 nike

这很奇怪。请注意,这是精简的示例代码,并故意遗漏了析构函数)。

template <class f, class g> class Ptr;

class RealBase
{
};

template <class a, class b, class c = Ptr<a,b> >
class Base : public RealBase
{
public:
Base(){};
};

template <class d, class e>
class Derived : public Base <d,e>
{
public:
Derived(){};
void DerivedMethod(){};
};
typedef Derived<double,double> D_Derived;

template <class f, class g>
class Ptr
{
public:
Ptr(){};
Ptr(Base<f,g,Ptr<f,g> >* a){in = a;};
Base<f,g,Ptr<f,g> >* operator->()
{
return in;
};

Base<f,g,Ptr<f,g> >& operator*()
{
return *in;
};
private:
Base<f,g,Ptr<f,g> >* in;
};

我在 vector 中使用此示例中的 Ptr 类,作为指向派生类的指针。

正如我们所见,Ptr 需要一个 Base<>*因为它是构造函数参数。

不幸的是,我需要一个带有 const Base<>* 的构造函数,我不能简单地这样做:

Ptr(const Base<>* a) { in = const_cast<Base<>*>(a)};

关于如何使此类接受 const Base<>* 的任何想法因为它是构造函数?


编辑:

好吧,事实证明我可以通过更改不相关的代码来解决这个问题,所以现在有点不成问题 =] 虽然我花了大约一天的时间来修复它 =[

最佳答案

我认为你需要定义一个单独的类来包装指向 const 的指针,因为不仅构造函数的参数,而且运算符的返回类型都应该更改为 const 版本。如果你让 ConstPtr 成为 Ptrfriend,这应该会很顺利:

template<...>
class ConstPtr {
const Base<...> *in;
ConstPtr(Base<...>* a) { in = a; }
ConstPtr(const Base<...>* a) { in = a; }
ConstPtr(const Ptr<...> &a) { in = a.in; }
...
};

要从原始指针构造包装器,您可以添加一个重载函数,或多或少像这样:

template<..., class P>
P make_ptr(Base<...> *t);

template<...>
Ptr<...> make_ptr< ..., Ptr<...> >(Base<...> *t) {
return Ptr(t);
}

template<...>
ConstPtr<...> make_ptr< ..., ConstPtr<...> >(const Base<...> *t) {
return ConstPtr(t)
}

关于c++ - const 指针作为构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/631282/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com