运算符重载和*指针的问题

时间:2014-03-09 01:43:31

标签: c++ arrays pointers operator-overloading this

我正在为自制的动态数组类进行运算符重载。我也试图学习如何使用* 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;
}

2 个答案:

答案 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;