2010-06-14 63 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