Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/135.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++ const指针作为构造函数参数_C++ - Fatal编程技术网

C++ const指针作为构造函数参数

C++ const指针作为构造函数参数,c++,C++,这是一个奇怪的问题。请注意,这是一个简化的示例代码,故意忽略析构函数) 模板类Ptr; 类RealBase { }; 模板 类库:公共RealBase { 公众: Base(){}; }; 模板 派生类:公共基 { 公众: 派生(){}; void DerivedMethod(){}; }; typedef派生D_派生; 模板 类Ptr { 公众: Ptr(){}; Ptr(Base*a){in=a;}; 基本*运算符->() { 返回; }; 基本和运算符*() { 返回*in; }; 私人:

这是一个奇怪的问题。请注意,这是一个简化的示例代码,故意忽略析构函数)

模板类Ptr;
类RealBase
{
};
模板
类库:公共RealBase
{
公众:
Base(){};
};
模板
派生类:公共基
{
公众:
派生(){};
void DerivedMethod(){};
};
typedef派生D_派生;
模板
类Ptr
{
公众:
Ptr(){};
Ptr(Base*a){in=a;};
基本*运算符->()
{
返回;
};
基本和运算符*()
{
返回*in;
};
私人:
基*in;
};
我在向量中使用这个例子中的Ptr类,作为指向派生类的指针

正如我们所看到的,Ptr采用
Base*
作为构造函数参数

不幸的是,我需要一个采用常量Base*的构造函数,我不能简单地做到这一点:

Ptr(const Base<>* a) { in = const_cast<Base<>*>(a)};
Ptr(const Base*a){in=const_cast(a)};
有没有办法让这个类接受一个
const Base*
作为构造函数


编辑:


好的,事实证明我可以通过更改不相关的代码来解决这个问题,所以现在这不是问题=[

我花了大约一天的时间来解决它,但是=[

您的
Ptr
类有一个非常量指针成员。如果没有一些不安全的强制转换,您将无法分配
const Base*
。您想要这样做吗?请尝试以下操作:

template <class f, class g>
class Ptr
{
   public:
    Ptr(){};
    Ptr(Base<f,g,Ptr<f,g> > const* 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;
};
模板
类Ptr
{
公众:
Ptr(){};
Ptr(基常数*a){in=*a;}
基本*运算符->()
{
返回&in;
};
基本和运算符*()
{
返回;
};
私人:
基地在;
};

您的
Ptr
类有一个非常量指针成员。如果没有一些不安全的强制转换,您将无法分配
常量基*
。是否要这样做?请尝试以下操作:

template <class f, class g>
class Ptr
{
   public:
    Ptr(){};
    Ptr(Base<f,g,Ptr<f,g> > const* 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;
};
模板
类Ptr
{
公众:
Ptr(){};
Ptr(基常数*a){in=*a;}
基本*运算符->()
{
返回&in;
};
基本和运算符*()
{
返回;
};
私人:
基地在;
};

根据您的示例,您应该这样做

Ptr( const Base< f,g, Ptr< f, g > >* a )
{
   in = const_cast< Base<f,g,Ptr<f,g> >* > ( a );
}
Ptr(常数基>*a)
{
in=常量铸造(a);
}

ps:我不喜欢const_cast,在类似的情况下,我试图避免这种情况。可能需要为const和non-const参数执行两种Ptr实现。

根据您的示例,您应该这样做

Ptr( const Base< f,g, Ptr< f, g > >* a )
{
   in = const_cast< Base<f,g,Ptr<f,g> >* > ( a );
}
Ptr(常数基>*a)
{
in=常量铸造(a);
}

ps:我不喜欢const_cast,在类似的情况下,我试图避免这种情况。可能需要为const和non-const参数执行两种Ptr实现。

我认为您需要定义一个单独的类来包装指向const的指针,因为不仅构造函数的参数,而且操作符的返回类型都应该更改为const versi如果你让
ConstPtr
成为
Ptr
friend
,这应该会很好地解决:

template<...>
class ConstPtr {
  const Base<...> *in;
  ConstPtr(Base<...>* a) { in = a; }
  ConstPtr(const Base<...>* a) { in = a; }
  ConstPtr(const Ptr<...> &a) { in = a.in; }
  ...
};
模板
类ConstPtr{
常数基*in;
ConstPtr(Base*a){in=a;}
ConstPtr(constbase*a){in=a;}
ConstPtr(ConstPtr&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)
}
模板
P make_ptr(基本*t);
模板
Ptr make_Ptr<…,Ptr>(基本*t){
返回Ptr(t);
}
模板
ConstPtr make_ptr<…,ConstPtr>(const Base*t){
返回常数(t)
}

我认为您需要定义一个单独的类来包装指向const的指针,因为不仅构造函数的参数,而且操作符的返回类型都应该更改为const版本。如果您将
ConstPtr
作为
Ptr
朋友,这应该可以很好地解决:

template<...>
class ConstPtr {
  const Base<...> *in;
  ConstPtr(Base<...>* a) { in = a; }
  ConstPtr(const Base<...>* a) { in = a; }
  ConstPtr(const Ptr<...> &a) { in = a.in; }
  ...
};
模板
类ConstPtr{
常数基*in;
ConstPtr(Base*a){in=a;}
ConstPtr(constbase*a){in=a;}
ConstPtr(ConstPtr&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)
}
模板
P make_ptr(基本*t);
模板
Ptr make_Ptr<…,Ptr>(基本*t){
返回Ptr(t);
}
模板
ConstPtr make_ptr<…,ConstPtr>(const Base*t){
返回常数(t)
}

“使用类型为'Ptr'的const_cast无效,该类型不是指针、引用,也不是指向数据成员类型的指针。”我已经说过这不是一个选项。我不知道你为什么不能编译我的示例。我在我的msvc 2005编译器上测试了这个-一切正常。请提供关于你的问题的最详细信息。我理解代码应该编译。但是,由于完全未知的,可能难以置信的复杂原因,它没有编译,正如我在问题中所说。我很抱歉我将删除-1,但您应该在回答之前仔细阅读问题。对不起,我确实阅读了您的问题,它有拼写错误,我已修复并编译,所有操作都正常。如果它现在未编译,您可以将comlette代码文件发送给我吗?我将有机会发现问题。对类型为“Ptr”的const_cast的使用无效,该类型不是指针、引用,也不是指向数据成员类型的指针。"我已经说过这不是一个选项。我不知道你为什么不能编译我的示例。我在我的msvc 2005编译器上测试了这个-一切正常。请提供关于你的问题的最详细信息。我理解代码应该编译。但是,由于完全未知的,可能难以置信的复杂原因,它没有编译,正如我在问题中所说。我很抱歉我将删除-1,但您应该在回答之前仔细阅读问题。对不起,我确实阅读了您的问题,它有拼写错误,我修复并编译了它,一切正常。如果它现在不编译,您能给我发送comlette代码文件吗?我将有机会发现问题。有没有可能对朋友的语法更详细一点?它不工作正如我所期望的,我想看看你到底在想什么!我的计划是把“friend ConstPtr;”放在“Ptr”的定义中,让ConstPtr的构造函数访问“a.in”。虽然我还没有测试过它,但可能有