【发布时间】:2019-04-01 22:42:55
【问题描述】:
我有一个类,它可以将非 const 指针或 const 指针作为其重载构造函数的参数。在我的特殊情况下,我需要从类const 的const 和non-const 方法实例化此类的一个对象@ ,但它从const 方法失败,因为它无法将const 指针分配给foo .
myClass() {
public:
myClass(T* v);
myClass(const T* v);
// ...
T* foo;
// ...
}
是否可以将两个构造函数中的参数分配给foo?如果是这样,正确的语法是什么?
编辑:
在更具体的情况下,我有一个类 myClass 环绕 std::vector 并允许我通过嵌套类 mySubset 直接访问向量的子集:
template<typename _type>
myClass() {
std::vector<_type> data;
public:
class mySubset(){
myClass<type>* foo;
public:
mySubset(myClass<_type>* _in) { foo = _in; };
mySubset(const myClass<_type>* _in) { foo = _in; /* error */ };
// ...
}
// ...
myClass();
// ...
void mySubset method() { return mySubset(this); };;
void mySubset const_method const() { return mySubset(this); /* error */ };
// ...
}
其中的代码无关紧要 - 基本上mySubset 允许读取和写入特定的向量位置。虽然我能够使用单独的 const 和非 const 嵌套类来实现我想要的,但我一直在寻找一种使用单一返回类型的方法。
【问题讨论】:
-
你能写一个五六行的程序来演示这个问题吗?
-
取决于上下文。请添加上下文以获得答案。你可以
const_cast离开const,但是你冒着修改不应修改的T的风险。无论是谁做到了const,都可能有充分的理由这样做。如果你持有T并且从不修改它const T* foo;可能是你最好的朋友。 -
将班级成员改为
const T* foo -
简单的答案是:不能有两个同名的成员。你需要使用不同的名字(见下面的例子)当你两者都需要,const 和 non-const 版本。在一些可能的情况下,您需要这样的构造,但我认为,还有其他可能的方法来解决这个问题。这一切都取决于上下文/请求的功能。它可以只使用 const 成员,或者使用另一个可以使用非 const 版本的 (child class) 来完成。要获得有意义的答案,请添加有关您的问题和背景的更多详细信息。
-
我用一个更详细的例子编辑了我的答案