我有一个名为Complex的类,其中许多成员方法返回该Complex类的对象,以及许多成员方法将类Complex的对象作为参数。
class Complex
{
public:
Complex sampleFunc(Complex c) { ... }
Complex operator+(Complex c) { ... }
};
这将是一个库,因此其他用户将使用我的类。因为,大多数用户使用:
Complex *ptrObj = new Complex(); // declaration 1
而不是使用:
Complex obj; // declaration 2
我上面编写的代码可以使用声明2,但不能使用声明1.我可以更改sampleFunc()的原型,如下所示:
Complex* sampleFunc(Complex *c) { ... }
但是我无法有意义地更改operator +()函数以获得添加两个对象的效果(而不是错误地添加两个指针)。那么,我应该暴露什么API - 适用于声明1或适用于声明2还是应该为每个函数提供两个版本?我相信传递指向函数的指针会更快,但操作符重载将是一个问题。
答案 0 :(得分:3)
首先,您通常最好避免传递值,并将您的成员函数指定为接受引用
class Complex
{
public:
Complex sampleFunc(const Complex &c) { ... }
Complex operator+(const Complex &c) { ... }
};
const
指定函数在调用者方面不会在逻辑上更改c
- 这通常与传递值相同,除了它不会创建副本传递的对象。
删除const
可以更改对象。
也就是说,如果将对象的副本传递给函数而不是引用,则可以将值传递给任何您喜欢的函数。
其次,您使用其他语言的先入之见正在显示,并导致您对C ++的错误结论。具体来说,你的信念
这将是一个库,因此其他用户将使用我的类。因为,大多数用户使用:
Complex *ptrObj = new Complex(); // declaration 1
而不是使用:
Complex obj; // declaration 2
是假的。大多数C ++开发人员,鉴于这两个选择,将默认使用第二种形式,因为在很多情况下,第一种形式是C ++中的不良实践 - 由于完成时需要delete ptrObj
,以避免内存泄漏,以及忘记这样做的可能性,特别是在非平凡的代码中。
使用库中的代码不会改变这一点。作为一个粗略的规则(并且,作为一个粗略的规则,有一些例外)如果您发现自己编写了大量使用C ++中的指针的代码(除非您正在编写标准库的版本),那么您的设计就会被破坏。
答案 1 :(得分:1)
正如您在评论中所述,您的O(g(n))
类基本上是一个可变长度字符串,包含Complex
加char*
。
然后,首先要做的是阻止此类用户执行int
,因为它效率不高。你正在你的类中进行动态内存分配,所以也没有必要在外部进行(你只需添加更多的指针间接)。
您应该以传统方式编写运算符,即接受引用,而不是指针。用户通常不需要处理指针,因为您的类将动态内存抽象为实现细节。
例如:
new Complex