gpt4 book ai didi

c++ - 错误: non-lvalue in assignment

转载 作者:行者123 更新时间:2023-11-30 00:58:29 25 4
gpt4 key购买 nike

#include <iostream>
using namespace std;

class Array
{
friend ostream &operator<<( ostream &, const Array & );
public:
Array( int = 5 );
Array( const Array & );
~Array();
int getSize() const;
const Array &operator=( const Array & );
// subscript operator for non-const objects returns modifiable lvalue
int &operator[]( int );
// subscript operator for const objects returns rvalue
int operator[]( int ) const;
private:
int size;
int *ptr;
};

Array::Array( int arraySize )
{
size = ( arraySize > 0 ? arraySize : 5 ); // validate arraySize
ptr = new int[ size ];

for ( int i = 0; i < size; i++ )
ptr[ i ] = 0;
}

// must receive a reference to prevent infinite recursion
Array::Array( const Array &arrayToCopy )
: size( arrayToCopy.size )
{
ptr = new int[ size ]; // create space for pointer-based array

for ( int i = 0; i < size; i++ )
ptr[ i ] = arrayToCopy.ptr[ i ]; // copy into object
}

Array::~Array()
{
delete [] ptr; // release pointer-based array space
}

int Array::getSize() const
{
return size; // number of elements in Array
}

const Array &Array::operator=( const Array &right )
{
if ( &right != this ) // avoid self-assignment
{
if ( size != right.size )
{
delete [] ptr; // release space
size = right.size; // resize this object
ptr = new int[ size ]; // create space for array copy
}

for ( int i = 0; i < size; i++ )
ptr[ i ] = right.ptr[ i ]; // copy array into object
}

return *this;
}

// overloaded subscript operator for non-const Arrays reference return creates a modifiable lvalue
int &Array::operator[]( int subscript )
{
cout << " ***************Inside non-sonstant operator[] function: Lvalue test*********** ";
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript
<< " out of range" << endl;
exit( 1 ); // terminate program; subscript out of range
}

return ptr[ subscript ]; // reference return
}

// overloaded subscript operator for const Arrays const reference return creates an rvalue
int Array::operator[]( int subscript ) const
{
cout << " ***************Inside sonstant operator[] function: Rvalue test*********** ";
if ( subscript < 0 || subscript >= size )
{
cerr << "\nError: Subscript " << subscript
<< " out of range" << endl;
exit( 1 );
}

return ptr[ subscript ]; // returns copy of this element
}


// overloaded output operator for class Array
ostream &operator<<( ostream &output, const Array &a )
{
int i;
// output private ptr-based array
for ( i = 0; i < a.size; i++ )
{
output << a.ptr[ i ] << " ";

if ( ( i + 1 ) % 4 == 0 )
output << endl;
} // end for

if ( i % 4 != 0 )
output << endl;

return output;
}

int main()
{
Array integers1( 4 );
Array integers2; // 5-element Array by default
const Array& integers4=integers1;
//integers4[3] = 2000; //Error : non-lvalue in assignment
integers1 = integers1; //valid
integers4 = integers1; //Error : binary '=' : no operator found
//which takes a left-hand operand of type 'const Array' (or there is no
//acceptable conversion)
cout << "\nintegers1[3] is " << integers4[ 3 ];

return 0;
}

给出错误:

1)在函数“int main()”中:

'=':左操作数必须是左值

2)二进制“=”:找不到运算符 它采用“const Array”类型的左侧操作数(或者没有 可接受的转换)

请帮忙。

最佳答案

您无法修改 const 引用,请尝试以下操作:

//Snippet1
Array& integers4=integers1;
integers4[3] = 2000;

为了澄清OP对修改const引用的疑问:

//Snippet2
//This will not compile as you saw.
const Array& integers4=integers1;
integers4[3] = 2000; //errors

现在这就是 Xeo 在对此的回复中所做的 post 。他没有更改引用,而是更改了原始变量。

//Snippet2
//This will compile and work identically to Snippet1.
const Array& integers4=integers1;
interger1[3] = 2000;

关于c++ - 错误: non-lvalue in assignment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6078513/

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