2015-05-03 19 views
1

我想在對象被評估時打印我的對象的id(我的主函數中的第三行「one = two; should output」Object id:2「)。我知道賦值操作符只被調用左值,對話運營商本身不會被調用,我不希望使用的函數調用操作對象評估時調用哪個運算符?

任何想法如何可以做到這一點,其經營者必須我超載

PS:?請忽略代碼的任何正常性,我只關心識別正確的超負荷運營商。

#include <iostream>  
class Object 
{ 
public: 
    Object(int id) : id_(id) 
    { 
    }  
    //Assignment operator only invoked for lvalue 
    Object& operator= (const Object& other) 
    { 
    std::cout << "Object id: " << id_ << std::endl; 
    return *this; 
    }  
    //Conversion operator to itself will never be called 
    operator Object() const 
    { 
    return *(this); 
    }  
    //Function call operator - not what I mean 
    Object operator()() 
    { 
    std::cout << "Object id: " << id_ << std::endl; 
    return *(this); 
    }  
private: 
    int id_; 
}; 

int main() 
{ 
    Object one(1); 
    Object two(2); 
    one = two; 
    one = two(); 
    return 0; 
} 
+2

如果你想讓賦值操作符打印其他的id,就這樣做。雖然你試圖達到的目標並不是很清楚。 – Mat

+1

@Mat我認爲問題在於對於其他的''id_'''沒有getter,並且它是一個私有成員變量。 –

+1

@PatrickRoberts:這不是問題。 – Mat

回答

1

「對象評估」的概念在C++中並不存在。當然可以評估表達式,並且操作符重載符合這個:foo = bar調用與操作數相匹配的任何重載operator=(並且具體而言,operator=必須是LHS類類型的成員)。但是這是正在評估的任務,而不是foobar(並且請注意,在運算符重載的上下文中,這些是作爲指針或引用存在的,因此任何一個都將被評估根本不是不可避免的)。

這裏適當的解決方案將取決於你要完成什麼。但是,只要代碼提及bar,就沒有一個函數會自動觸發。

+0

感謝所有的答案。我選擇了Sneftel的答案,因爲它讓我意識到,沒有像「一般在評估時被調用的操作員」這樣的事情。是的,比爾,帕特里克和其他人,你是對的,在我的例子中,我們可以使用賦值操作符完成打印。但是,如果對象將在不同的上下文中進行評估,那麼賦值操作就不相關。 – Christian

0
#include <iostream>  
class Object 
{ 
public: 
    Object(int id) : id_(id) 
    { 
    }  
    //Assignment operator only invoked for lvalue 
    Object& operator= (const Object& other) 
    { 
    std::cout << "Object id: " << other.id_ << std::endl; 
    return *this; 
    }  
private: 
    int id_; 
}; 

int main() 
{ 
    Object one(1); 
    Object two(2); 
    one = two; 
    return 0; 
} 

我試過這個來看看Mat是否正確,事實證明它會按預期編譯和打印"Object id: 2"

0

所以,這條線:

one = two; 

將調用這個函數,你已經有了:

Object& operator= (const Object& other) 
{ 
    std::cout << "Object id: " << id_ << std::endl; 
    return *this; 
} 

然而,我們注意到,有兩個Object對象是在功能可見。

Object& operator= (const Object& other) 
{ 
    std::cout << "Object(" << this->id_ << ")"; 
    std::cout << " = "; 
    std::cout << "Object(" << other.id_ << ")"; 
    std::cout << "\n"; 
    return *this; 
} 

您可以看到一個完整的示例,我們在ideone.com上運行此代碼。

相關問題