2010-06-14 44 views
0

我有一個String類,我想重載+添加兩個String *指針。 這樣的事情不工作:重載+添加兩個指針

String* operator+(String* s1, String* s2); 

有什麼辦法,以避免通過引用傳遞。 考慮這個例子:

String* s1 = new String("Hello"); 
String* s2 = new String("World"); 

String* s3 = s1 + s2; 

我需要這種補充工作。請建議。

+4

是否有你不使用std的原因: :字符串? – 2010-06-14 05:33:49

+1

你有Java或C#背景嗎?另外,爲什麼要添加兩個不同的String對象的指針,以及對於s3有什麼結果? – Alerty 2010-06-14 05:38:16

+2

C++ 101:不要在沒有指針的時候使用指針然後你1)有機會避免內存泄漏,2)獲得更簡潔和可讀的代碼,3)可以得到額外的工作。 – jalf 2010-06-14 09:21:58

回答

2

您不能僅使用指針進行重載。您需要至少有一個類類型或枚舉值。標準方法是在兩個值上過載:

String operator+(String s1, String s2); 
8

您不能。您不能爲內置類型重載運算符。無論如何,爲什麼要使用指針呢?儘可能避免動態分配!

String s1("Hello"); 
String s2("World"); 

String s3 = s1 + s2; 

這樣好多了,不會泄漏。現在你可以超載:

String operator+(const String& s1, const String& s2); 

你的願望。這當然是浪費時間,因爲std::string存在。 :)

+0

「您不能爲內置類型重載運算符。」 標準中提到了這個事實嗎?哪裏? – 2010-06-14 07:01:44

+0

@ 6pack這是該語言的基本原理。 C++應該是可擴展的,但不可變。 – fredoverflow 2010-06-14 07:42:54

+0

謝謝GMan。我決定在我的情況下不使用指針。 – Jeet 2010-06-15 11:13:28

1

不知道如果你已經想通了這一點,但String* s3 = s2 + s1;加入2個指針和 2串,有沒有辦法可以改變這裏的語義。

歡迎您擁有您自己的String類,但請確保您自己確實是您真正需要的。在最一般的情況下,std :: string就足夠了。

而當你在它,儘量不要偏離太多當然,除非有相似的類從標準公開的API的正當理由。所以也許你可以用一個字符串和一個字符串*做一個operator +,但是你真的想要嗎?如果人們需要維護你的代碼,並且來自STL/Boost後臺,那麼期望事情能夠以某種方式工作。這有助於更輕鬆地進行調試。

Arpan

+0

你不能添加指針。 – fredoverflow 2010-06-14 07:45:21

+0

@Fred,我同意。我正在指出代碼在做什麼。 – Fanatic23 2010-06-14 08:14:58

2

我有一個String類,我想 過載+添加兩個字符串* 指針。

爲什麼?

這樣的事情不工作:

字符串*運算符+(字符串* S1,字符串* S2);

這是C++的核心功能。你不能像那樣改變它。

有什麼辦法可以避免通過 參考。

您可以通過引用,按指針或按值傳遞。

按價值是無效的(如獲得創建和複製的沒有正當理由的臨時*)

通過指針是不是在這種情況下,可以使用(添加指針爲核心的語言功能)。實際上,引用被添加到語言中,以傳遞指針的效率作爲參數(重載運算符)和傳遞值的方便語法。換句話說,參考文獻是根據您的具體情況創建的語言功能他們是最佳的解決方案。

參考是通常接受的解決方案。你能否告訴我們爲什麼你的情況不好?

考慮這個例子:

字符串* S1 =新字符串( 「你好」); String * s2 = new String(「World」);

String * s3 = s1 + s2;

這看起來像Java或C#代碼,已轉換爲C++語法。 不要那樣做。這種心態被稱爲「我可以用任何語言編程C」,它通常會將您嘗試移植到C++的任何心態的內在問題與C++的固有問題結合起來,而沒有任何優勢。

我不是說你在做這件事,我只是說要確保你沒有做到這一點:)。

我需要這種補充工作。 請推薦。

您可以定義一個額外的智能指針類來存放您的字符串。它不需要做太多(只是一個struct ptr { String* _value; /* add your syntax sugar and operators here */ }就足夠了。也就是說,它仍然是一個壞主意這樣做只是爲了增加指針。

+0

utnapistim,你是對的,它是一個移植到C++的java代碼。 – Jeet 2010-06-15 11:17:01