创建自己的“数据类型”

3

我希望能够创建一个包含3个浮点数(x,y,z)的类型。我尝试过:

typedef struct
{
 float x;
 float y;
 float z;
} Vertex;

但是那并没有起作用。

这个需要在可以被 main 看到的地方声明吗?我该如何为我创建的类型创建 getter 方法和其他方法?


8
它的哪个部分“失败”了?您能提供一些关于错误的提示吗? - user541686
5
你有没有读过关于C或C++基础的书? - atzz
1
C++中出现“Vertex was not declared in this scope”的错误。 - CurtisJC
1
getter/setter 方法并不适用于结构体,它们存在于类中,而类在 C++ 中出现,而非 C 中。 - FrustratedWithFormsDesigner
2
这是C语言,不是C++。你正在声明一个未命名的结构体,并对其进行了typedef。由于该结构体没有名称,因此它不能具有非默认构造函数。请考虑改用struct Vertex { float x, y, z; }; - Alexandre C.
显示剩余2条评论
3个回答

5

我会在C++中这样做。请参见main()的示例用法。注意:这未经编译或测试。

#include <iostream>

class Vertex
{
public:
  // Construction
  Vertex(float x,float y, float z) : x_(x), y_(y), z_(z) {}

  // Getters
  float getX() const {return x_;}
  float getY() const {return y_;}
  float getZ() const {return z_;}

  // Setters
  void setX(float val) {x_ = val;}
  void setY(float val) {y_ = val;}
  void setZ(float val) {z_ = val;}
private:
  float x_;
  float y_;
  float z_;
};

int main()
{
  Vertex v(6.0f,7.2f,3.3f);
  v.setZ(7.7f);
  std::cout < "vertex components are " << v.getX() << ',' << v.getY() << ',' << v.getZ() << std::endl;
}

2
我对此进行了负评,因为没有使用公共变量,而它们完全是正确的。 - Alexandre C.
@Alexandre C. 嗯,这取决于应用程序/库的要求以及未来的发展。对我来说,获取器和设置器是邪恶的是个秘密。正如 OP 所说,它确切地做到了他想要的,因此它符合他的要求。你所做的任何假设都是“完全错误的” :) - PeteUK
未来这个类可能会如何发展:我从未见过一个Point3D类失控的情况... - Alexandre C.
1
这样想:你的设计在哪些方面比 struct Point3d { double x, y, z; } 更优秀? - Alexandre C.
1
哇,看起来争论很激烈:S 如果有帮助的话,我认为只需能够编写p.x以返回x会更好,但我也想编写其他方法与之配合,例如归一化方法,将其视为向量或计算多边形法线等。在类中创建方法(如获取器和设置器)看起来要容易得多,但是我还是很新手,结构体和类之间有什么优缺点吗? - CurtisJC
显示剩余11条评论

1

使用C语言,这对我很有效

typedef struct { float x; float y; float z; } Vertex;

int main(void) {
  Vertex a = {42, -42, 0};
  if (a.x + a.y + a.z == 0) return 1; /* warning about comparing floating point values */
  return 0;
}

1
他可能仍然遇到了"未在此范围内声明"的问题,因为他并没有提及其他错误类型,而大多数人会注意到是否出现了不同类型的错误。至少输出信息看起来应该是不同的。 - FrustratedWithFormsDesigner
我收到了一个错误消息,说在这个范围内未声明Vertex,我正在使用C++,除了if语句之外,我的代码基本上与此答案完全相同。 - CurtisJC
你使用的编译器是什么?使用了哪些选项?(注意我不懂C++,两种语言可能有所不同) - pmg

1
这个需要在哪里声明才能被主函数看到呢?
是的。通常情况下,类或结构体会在头文件中声明,在你使用它的任何翻译单元(c文件)中使用#include引入。

我把它放在与大多数方法相同的文件中,因此我认为它会像方法一样“看到”它 :S - CurtisJC
2
@Curtis:此时,您应该发布更多的代码。请发布您声明结构体的位置以及您尝试使用它的位置。 - John Dibling
在main函数中,Vertex vert = {1,2,3};,以及结构体Vertex定义如下:struct Vertex { float x; float y; float z; };但是在main函数之后出现了问题,不起作用。(这是根据这里的所有人所说的更改后的结果:S) - CurtisJC
2
@CurtisJC:这不太易读。最好在你的主要问题中发布完整的源代码清单(你可以编辑自己的问题进行更改),而不是在评论中发布片段。 - FrustratedWithFormsDesigner
5
@Curtis 结构体 Vertex 需要放在 main() 函数之前。 - DanS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接