確切的情況是: 我已經在系統API結構中定義了CGPoint
和CGSize
,我希望能夠寫出my_point = my_size
。 我不能修改CGPoint
結構體,只能寫外部運算符。我可以編寫二進制運算符(+
,-
,...),但operator=
必須在結構中聲明。那麼還有其他解決方案嗎?是否可以在結構體外寫入自動投射運算符?
回答
爲了表達a = b;
編譯你需要,它利用b
類型,或類型從b
隱式轉換的元素a
類型要麼有一個operator=
。
第一種情況被排除,因爲operator=
必須是班級的成員,並且由於您無法修改GLPoint
,因此您不能添加GLPoint& GLPoint::operator=(GLSize)
。
第二種情況存在相同類型的問題。從GLSize
到GLPoint
的隱式轉換可以作爲GLPoint
(排除)中的隱式構造函數來實現,或者作爲中的成員operator GLPoint()
來實現,這需要修改GLSize
。轉換不能作爲自由功能添加。
替代方法使用非運算符語法,如添加免費函數assign
(或copy
):GLPoint& assign(GLPoint&, GLSize const &)
。
接下來的問題是你爲什麼要這麼做。如果GLPoint
和GLSize
的設計者不認爲大小應該可以分配給某個點,那麼您爲什麼覺得它們應該是可分配的?通常,將類型分開是個不錯的主意,因爲這將使編譯器能夠檢測到您在代碼中可能犯的錯誤。
如果允許GLSize
到GLPoint
隱式轉換,你可能會被錯誤類型是這樣的:distance(point1, size2)
,你的意思distance(point1, point2)
,而且因爲有一個轉換,編譯器會很高興地轉化和應用。然後你會看到奇怪的結果,你將花費不少好的調試時間,試圖確定邏輯錯誤的地方。
除非域名對每個運營商在這種情況下的含義有非常明確的定義,否則我將不惜一切代價避免運營商超載。將大家立刻讀懂你的代碼瞭解什麼GLPoint(1,2) + GLSize(5)
代表毫無疑問或含糊不清?如果不是這種情況,如果人們會感到驚訝,甚至懷疑,則避免操作符重載和使用命名功能:move_up(GLPoint&, GLSize)
(或任何點+尺寸意味着你)
當您將CGSize
到CGPoint
- 什麼發生?把它溶解到一些運營商那裏,然後你有它 - 例如
CGPoint& operator|=(CGPoint& cPoint, CGSize const& cSize)
{
// now set attributes of cPoint that you can extract from cSize
return cPoint;
}
這有什麼困難嗎?這裏是一個例子:http://www.ideone.com/FZN20
對於簡單的情況,這是一個很好的解決方案,我想用CGSize在表達式中進行操作...... – brigadir 2011-05-25 08:39:23
'我想在表達式中使用它'正確。例如在我的例子中,我想要做一些像'LONGLONG size = blah(); SetFilePointerEx(fh,size,NULL,FILE_BEGIN);'而不是必須做'LONGLONG size = blah(); LARGE_INTEGER tli = {0}; tli.QuadPart =大小; SetFilePointerEx(fh,tli,NULL,FILE_BEGIN);'如果我可以寫'LARGE_INTEGER operator =(LONGLONG ll){LARGE_INTEGER li = {0}; li.QuadPart = 11;返回li;}'(或者一個轉換操作符),那麼它會創建更簡單易用的代碼。 – Synetech 2013-07-17 17:23:41
我更喜歡'operator <<' – kyb 2016-12-15 16:35:03
如果你可以派生或包裝CGPoint並在整個代碼中使用新類,那麼你可以提供你喜歡的任何操作符。新班級可以有一個轉換操作員到CGPoint
,以促進與現有功能的交互。
這很容易出問題而不是幫助。繼承是第二大耦合關係,應該避免,除非它是有道理的,在這種情況下,我不認爲它是確實存在的。考慮現有的代碼仍然會返回非派生類型,然後您將混合可以分配不能的點的點。更糟糕的是,目前的系統可能會希望'GLPoint'的容器,如果它是按值的,那麼它不會接受新的類型,如果它是通過指針,並且它試圖在內部「刪除」,那麼你是在未定義的行爲土地... – 2011-05-25 07:55:21
@大衛:他們當然是考慮,應該指導選擇派生與包裝/組成,並可以使我列出的技術不適合特定問題。平衡取決於需要「真正的」GLPoint的函數與可能受益於此賦值符號的便利性的應用程序內部代碼量的多少交互點。直到OP來評估他們的情況。 – 2011-05-25 09:11:30
其他答案接縫錯過顯而易見的解決方案:添加一個函數將CGPoint轉換爲CGSize。關當然,這不是正是你想要的(size = point
),但因爲你不能修改兩類要麼,這是唯一的方法:
CGSize ToSize(const CGPoint &pt)
{
CGSize res = ...
// do the conversion
return res;
}
- 1. 是否可以從窗體自動寫入.xspf?我在想C#
- 2. 構造函數重載選擇投射運算符而不是結構類型
- 3. 是否可以投射類型參數?
- 4. 是否可以通過反射調用值類型運算符?
- 5. 指向結構體並投射
- 6. 是否可以添加運算符類?
- 7. 是否可以自動創建自動映射器映射?
- 8. autohotkey是否可以在自己的腳本中寫入運行?
- 9. 是否可以在C#中以相同類型自動投遞服務結果?
- 10. 是否可以重寫Java中的運算符?
- 11. iOS 5:是否可以將一個結構寫入plist文件?
- 12. 是否可以使用C++編寫自定義的轉換運算符(如`static_cast`)?
- 13. 是否可以使用運算符作爲映射中的映射值?
- 14. 實體框架的SQL運算符函數是否可以防範SQL注入?
- 15. 是否可以動態更改對象的投射?
- 16. 是否可以向接收器投射來自手機麥克風的輸入?
- 17. 可以以某種方式在類定義之外提供等價的運算符bool投射嗎?
- 18. 是否可以投入MongoDB-Query?
- 19. Java:是否有一種方法可以自動投射返回值?
- 20. 包裝結構中的變量是否可以自動讀取?
- 21. KnowledgeAgent是否可以用於自動將知識庫寫入文件以便可以在外部使用?
- 22. 是否可以使用動態運算符創建動態算術表達式?
- 23. 是否可以從VB6讀取/寫入用C#編寫的類/結構?
- 24. 是否可以自動生成插入外鍵
- 25. 是否可以在結構體上調用put_in調用?
- 26. 是否可以在ASP.NET MVC中使用n層體系結構?
- 27. 我可以在不使用點運算符的情況下訪問結構體內的結構嗎?
- 28. 結構運算符超載
- 29. 重載結構運算符
- 30. SceneKit:是否可以在透明對象上投射陰影?
什麼是點和大小之間的關係?大小怎麼可能是一個點?聽起來像不同的尺寸。 – 2011-05-25 07:43:04