我正在为自制的动态数组类进行运算符重载。我也试图学习如何使用* this指针,但它不是那么顺利。下面是我认为需要解释这个问题的类的部分和我的代码。
我不明白为什么当* this指针指向+等式的左侧时,我无法在* this指针上调用成员函数。
<<和>>已经超负荷工作了。
cout << "Please enter a word to add:";
string theWord;
cin >> theWord;
//add word
array1 = array1 + theWord;
cout << "array1: " << array1 << endl;
class DynamicArray
{
public:
//constructor
DynamicArray(int initialcapacity = 10);
//copy constructor
DynamicArray(const DynamicArray& rhs);
//destructor
~DynamicArray();
//operator+ - add a string
DynamicArray operator+(const string& rhs) const;
//operator+ - concatenate another DynamicArray
DynamicArray operator+(const DynamicArray& rhs) const;
//change the capacity of the DynamicArray to the newCapacity -
// may reduce the size of the array - entries past newCapacity will be lost
void resize(int newCapacity);
private:
string* mWords;//pointer to dynamic array of strings
int mNumWords;//the current number of words being kept in the dynamic array
int mCapacity;//the current capacity of the dynamic array (how many strings could fit in the array)
//display all the contained strings (each on a newline) to the output stream provided
void displayContents(ostream& output) const;
//add all the strings contained in the input stream to the dynamic array - resize if necessary
//return how many words are added to the array
int addWords(ifstream &input);
//add a single word to the dynamic array - resize if necessary
void addWord(const string& word);
};
//add a single word to the dynamic array - resize if necessary
void DynamicArray::addWord(const string& word)
{
if (mNumWords >= mCapacity)//need more space?
{
resize(mCapacity + 1);
}
mWords[mNumWords] = word;
mNumWords++;
}
//operator+ - add a string
DynamicArray DynamicArray::operator+(const string& rhs) const
{
//this doesn't work, why doesn't it, how should/do I use the
//this pointer properly
this.addWord(rhs);
return *this;
}
答案 0 :(得分:0)
除了使用 this。而不是 this-&gt; 之外,您还将operator +定义为const成员函数。这意味着不能对任何成员进行变异,也不会执行对非const成员函数函数的调用。你的addword函数是非const的。这就是错误的原因 - 你违反了const的正确性。
另外,为什么要在代码中调用operator +来改变数组?该运算符不需要更改当前对象的任何方面。我可以理解operator + =变异对象,但不能理解operator +。
你应该做的是先写一个算子+ =。此运算符可以改变当前对象,因为这是+ =(更改当前对象)的语义。然后operator +可以这样写:
//operator+ - add a string
DynamicArray DynamicArray::operator+(const string& rhs) const
{
DynamicArray temp = *this;
temp += rhs;
return temp;
}
这假设您有一个工作副本构造函数。在上面的示例中,您正在变异临时变量,在临时变量上调用+ =并返回临时变量。 此对象不会更改。
以下是您的运营商+ =的样子:
DynamicArray& DynamicArray::operator+=(const string& rhs)
{
this.addWord(rhs);
return *this;
}
现在operator + =变为非const,因为+ =的意图是更改当前对象。请注意,返回值是对当前对象的引用。现在,这与操作员+上方协同工作。
答案 1 :(得分:0)
您的operator+
必须是非const的,因为您想要更改每个被调用对象的状态。你也不用写
this->addWord( rhs); // correct but not needed
因为隐式地在this
指针上调用类成员函数内的方法。鉴于此,你可以写:
DynamicArray DynamicArray::operator+(const string& rhs)
{
addWord( rhs);
return *this;
}
您还可以将此运算符实现为void
:
void DynamicArray::operator+(const string& rhs)
{
addWord( rhs);
}
并以这种方式使用它:
array1 + theWord;