C++ 让一名推荐会员推荐另一名会员是否合法?
我正在开发一个类,在这个类中,我试图使用引用其他成员变量的常量引用成员来提供对这些成员的公共常量访问。有没有合法的方法 代码可以编译,但在将引用成员绑定到临时值时给出了警告。调用C++ 让一名推荐会员推荐另一名会员是否合法?,c++,reference,C++,Reference,我正在开发一个类,在这个类中,我试图使用引用其他成员变量的常量引用成员来提供对这些成员的公共常量访问。有没有合法的方法 代码可以编译,但在将引用成员绑定到临时值时给出了警告。调用resize()后,A不知何故仍然指向null,尽管myA得到更新 下面是我正在尝试做的一个再创造。我认为自引用位是非法的,会导致问题,但我不确定。任何意见都将不胜感激 class MyClass{ private: int mySize; double * myA; void resi
resize()
后,A
不知何故仍然指向null,尽管myA
得到更新
下面是我正在尝试做的一个再创造。我认为自引用位是非法的,会导致问题,但我不确定。任何意见都将不胜感激
class MyClass{
private:
int mySize;
double * myA;
void resize(int inSize) {
mySize = inSize;
delete [] myA;
// detection for non-positive size is not included for brevity
myA = new double [size];
}
public:
const int & size;
const double * const & A;
MyClass():
mySize(0) , myA(nullptr)
size(mySize), A(myA) {}
// dtor is not included
};
int main(){
MyClass myObj;
myObj.resize(42);
// myObj.A[1] = 0.5 // seg fault
}
编辑:Michael指出这个问题与A
的const
限定符有关,我通过更改A
的限定符确认了这一点,结果如下:
double*&A
->A
正确绑定到myA
double*const&A
->A
正确绑定到myA
const double*&A
->不兼容。编译器错误
constdouble*const&A
->A
绑定到临时变量
编辑:似乎更好的做法是使用getter函数。初始化
a(myA)
的问题是a
的类型是const double*const&
,而myA
的类型是double*
。A
所指的类型与myA
的类型不同(感谢@guest对此的澄清)。因此,引用a
将绑定到从prvalue具体化的临时对象,prvalue是将myA
隐式转换为const double*const
的结果。但是,临时文件的生存期不会延长,因此,临时文件将在初始化后立即销毁,留下A
。这就是编译器在这里警告您的
引用自己的成员并不违法。问题是:这样做有什么意义?虽然引用本身不是对象,也不确定它们是否占用存储空间,但编译器通常会通过引入包含引用所引用对象地址的字段来实现引用成员变量(换句话说:引用将编译为基本指针)。因此,在上面的示例中,
MyClass
类型的对象使用的内存的一半将用于存储指向存储地址的对象的地址。要知道这些地址中的一个地址在哪里,需要知道它们指向的东西在哪里……因此这并不违法,但可能不是一件好事……类型double*
和const double*
不兼容,因此,不能从前者的实例初始化对后者的引用。但是,这并不是非法的,而是编译器生成一个临时绑定到引用(导致一个悬空引用--IMHO,这是不允许的,即是一个错误)
如果您的意图是提供对您的private
数据的public
const
访问,那么标准方法是使用成员函数:
int size() const noexcept { return mySize; }
const double* A() const noexcept { return myA; }
编译器将对其进行优化
使代码正常工作的另一种方法是添加另一个私有成员:
double*myA;
const double*myAconst;
const double* const& A = myAconst;
并确保
myA
和myacost
始终指向同一地址。如果需要修改分配的元素,您也可以避免使用myacost
而使用const\u cast(myacost)
(这是对const\u cast
的合法使用,因为地址指向真实的非常量数据。设置size
的位置在哪里?我看到mySize=inSize
,但没有size=
任何内容。即使它是合法的,这也是一个相当奇怪的构造。为什么你对自己的成员有公开引用?应该有效,但因为refErrices不能被重新配置,你失去了分配类的能力(谈到,熟悉自己和朋友)。为什么不<代码> const 返回GETTER函数?它们会编译成空的。此外,考虑使用<代码> STD::vector < /代码>。它为你处理所有的内存管理。(包括遵守五个规则,因此MyClass
可以坚持零规则)@user4581301我知道getter函数,只是想知道这种替代方法是否有效。我不认为这种引用会妨碍复制/赋值,因为类可以只更改mySize
/myA
。@0x499602D2基本上是const double*getA()的替代方法const;
。Getter函数很好,但在我猜的代码中看起来相当笨拙。感谢您找到这些引号。为我节省了很多时间。GCC 8中存在相同或非常类似的错误。GCC发出了警告,但经过编译,程序打印了错误的引用地址。@MichaelKenzel谢谢您的回答!在gcc5.4上测试过,似乎编译得很完美。@YifanLai注意,它可能是错误的,我必须进行更彻底的检查,了解更多信息后将立即更新…问题是const double*
,是的。对于直接绑定,只有顶级限定符可能不同。