Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ 让一名推荐会员推荐另一名会员是否合法?_C++_Reference - Fatal编程技术网

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*
,是的。对于直接绑定,只有顶级限定符可能不同。