首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++类最佳实践

C++类最佳实践
EN

Stack Overflow用户
提问于 2009-03-09 04:34:34
回答 7查看 10.8K关注 1票数 4

在设计c++类时,我想知道一些最佳实践。

在上下文中,我有一个名为c++的Vec3类。

代码语言:javascript
复制
class Vec3{
private:
    float elements[3];
public:
    Vec3(Vec3 v1){...}
    Vec3(int x, int y, int z){...}
    Vec3 add(Vec3 v1){...}
    Vec3 add(int x, int y, int z){...}
    ...
    Vec3 multiply(Vec3 v1){...}
    ...
    int dotProduct(Vec3 v1){...}
    Vec3 normalize(){...}
    ....
    int operator[](int pos){...}
};

所以,我有一个类,它在3的向量上进行计算,我想知道更好的是什么。是否使用指针。

我是否应该返回指针并将参数作为指针使用。

Vec3 add(Vec3 v1)或Vec3 3* add(Vec3 v1)或Vec3 3*add(Vec3 3* v1)或.

现在我很困惑,我不知道我是否应该在课堂上使用指针。我想总有一种方法可以把我的论点发送给不处理指针的函数.

代码语言:javascript
复制
Vec3* v2 = new Vec3(1,1,1);
Vec3 sum = v1.add(*v2);

我能想出的最好的办法就是.兼具两种功能

代码语言:javascript
复制
Vec3 add(Vec3 v2){...}
Vec3* add(Vec3* v2){...}

但我担心这会导致重复代码,而且可能会造成开销。

谢谢您的answers...btw,我可以使用一个模板来更改向量的大小,但我更愿意保持Vec3类的独处,创建一个Vec4类,或者将其命名为四元数。

编辑这里是我提供的解决方案。请随时评论、修改或重用代码。有一件事。我只想提一下,在我的例子中,这门课应该是透明的。就像我们加数字一样。

代码语言:javascript
复制
int i = 10;
int j = 15;
int k = i + k;

如果添加重载修改了调用函数的对象,在本例中,我将赋予一个k作为对i和我等于25的引用。但我们真正想要的是,k等于25,i,k不变。

这就是我上课的方式。Vec3 k=i+k不会修改i或k,因为我们正在根据这些值创建一个新的数字。我返回引用的唯一情况是+=、-=、++、-.,set(XYZ)?并恢复正常。

做像myvec.setX(10).normalize().scale(10)这样的事情可能很有趣。

注:比例尺应返回引用。我没看到但我想这样会更好。

代码语言:javascript
复制
Vec3 t = myvec.normalize().scale(100).copy();

http://pastebin.com/f413b7ffb

谢谢大家,我现在正在学习矩阵课程。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-03-09 04:45:37

这些是我通常遵守的规则。注:“通常”,有时有一些不同的理由.

对于不打算修改的参数,如果参数不太大,则按值传递,因为它们将被复制。如果它们有点大或者不可复制,您可以使用const引用或指针(我更喜欢const引用)。

对于我确实打算修改的参数,我使用一个引用。

对于返回值,我将尽可能地返回一个副本。有时,返回引用是很方便的(对于get/set的单个函数,在获取或设置项时不需要进行任何特殊处理)。

在我看来,指针真正发光的地方是变量,例如,当它被构造或破坏时,我想要控制它。

希望这能有所帮助。

票数 8
EN

Stack Overflow用户

发布于 2009-03-09 04:44:55

因为整数是主元素,所以保持原样。对于任何具有vec3 3的使用引用的信息。

例如:

代码语言:javascript
复制
Vec3 add(const Vec3 &v1){...}

在C中,您可以使用指针,但在c++中,引用通常更适合对象。

票数 3
EN

Stack Overflow用户

发布于 2009-03-09 06:36:52

向量具有已知的语义(您和类的用户都知道),因此在这样做时,我会考虑重载运算符(+、-、+=、-=),在这样做时,我将使用常规定义,而不是修改它们:

代码语言:javascript
复制
// instead of add:
class Vec3 {
public:
   Vec3& operator+=( Vec3 const & rhs );
};
// implemented as free function:
Vec3 operator+( Vec3 const &lhs, Vec3 const & rhs);

我会避免使用指针。引用更自然,如果您确实需要引用/值而不是引用/值,那么只有非常小的一组情况。避免重复您的函数(有/没有指针),因为这将不必要地使您的代码更加复杂,正如您在问题中已经发布的那样,您始终可以取消引用的引用。

提供常量和非常量operator[]:

代码语言:javascript
复制
class Vec3 {
public:
   float operator[]( size_t pos ) const; // returns copy, data does not change
   float& operator[]( size_t pos );  // returns a reference and allows changing the contents
};

编辑:我忘了提到size_t细节:更喜欢对索引参数使用无符号/ size_t,而不是有符号整数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/625023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档