C ++中的结构可以在里面有函数吗?

时间:2016-01-02 12:58:40

标签: c++ class oop struct

在读书时,我遇到了这些问题:

  

C ++中的结构和类之间的语法差异非常小,因此,它们可以互换使用并进行微小修改。结构和类之间的唯一区别是,默认情况下,类的成员是私有的,而默认情况下,结构的成员是公共的。

然而,我的老师告诉我,我们不能在结构内部有功能。我读过的这本书非常受欢迎,我认为写在上面的书是正确的。 是否可以在结构内部使用函数?如果是,请留下示例或参考链接。

3 个答案:

答案 0 :(得分:5)

C struct不能拥有成员函数。 (它可以有函数指针,但这不是一回事。)

C ++ struct在各个方面都相当于class,但其成员的默认可见性,如您的书所述public struct,{{ 1}} for private)及其默认继承。

class

在上面的示例中,明确地显示状态可见性(class MyClass : public BaseClass { public: MyClass(); virtual ~MyClass(); void someFunction(); private: int member_; }; public)而不依赖于默认值(为了清晰起见,我赞同这种做法),关键字private可以是交换class而没有任何意义或结果的变化。

有一些理解认为struct对于普通数据集合是首选,而struct是具有非平凡功能的完全成熟类的首选,但就目前而言是这样。

也许你的老师在谈论 C class

答案 1 :(得分:2)

struct中方法的示例:

  // global state
var 
      // keeps track of original object scale
    pinchScale = new THREE.Vector3(),

      // current first touch
    touch1 = new THREE.Vector2(),

      // current second touch
    touch2 = new THREE.Vector2(),

      // first touch at touch start
    touch1OnHold = new THREE.Vector2(),

      // second touch at touch start
    touch2OnHold = new THREE.Vector2(),

      // keeps track of total held rotation at last fired touchmove event
    angularHoldPrev = new THREE.Quaternion();

  ⋮

  // key-value pairs inside an addEventListener utility
touchstart: function (event) {
  event.preventDefault();
  if ( event.touches.length === 1 ) {
    …
  } else if ( event.touches.length === 2 ) {
    touch1OnHold.set(event.touches[0].pageX, event.touches[0].pageY);
    touch2OnHold.set(event.touches[1].pageX, event.touches[1].pageY);
    angularHoldPrev.set(0, 0, 0, 1)
  }
},
touchmove: function (event) {
  event.preventDefault();
  if ( event.touches.length === 1 ) {
    …
  } else if ( event.touches.length === 2 ) {
    touch1.set(event.touches[0].pageX, event.touches[0].pageY);
    touch2.set(event.touches[1].pageX, event.touches[1].pageY);
    var 
          // get touch spread at present event firing, and at the start of current hold
        touchDiff = touch2.clone().sub(touch1),
        touchDiffOnHold = touch2OnHold.clone().sub(touch1OnHold),

          // camera is on z-axis; get this axis regardless of obj orientation
        axis1 = new THREE.Vector3(0, 0, 1).applyQuaternion(obj.quaternion.clone().inverse()),

          // get a touch rotation around this axis
        rot1 = new THREE.Quaternion().setFromAxisAngle(axis1, (Math.atan2(touchDiffOnHold.y, touchDiffOnHold.x) - Math.atan2(touchDiff.y, touchDiff.x))).normalize(),

          // get touch barycentre at present event firing, and at the start of current hold
        touchCentre = touch1.clone().add(touch2).multiplyScalar(.5),
        touchCentreOnHold = touch1OnHold.clone().add(touch2OnHold).multiplyScalar(.5),

          // get axis of touch barycentre movement on the xy plane, regardless of obj orientation
        axis2 = new THREE.Vector3(touchCentre.y - touchCentreOnHold.y, touchCentre.x - touchCentreOnHold.x, 0).applyQuaternion(obj.quaternion.clone().inverse()),

          // get a rotation proportional to magnitude of touch movement
        rot2 = new THREE.Quaternion().setFromAxisAngle(axis2, axis2.length() * rotationSensitivity).normalize(),

          // combine the two rotations
        rot = rot1.multiply(rot2);

      // undo last rotation if not the empty quaternion
    if (!angularHoldPrev.equals(new THREE.Quaternion())) obj.quaternion.multiply(angularHoldPrev.inverse());

      // perform the currently calculated rotation
    obj.quaternion.multiply(rot);

      // save this rotation for next event firing
    angularHoldPrev.copy(rot);

      // resize object according to change in touch spread
    obj.scale.copy(pinchScale.clone().multiplyScalar(touchDiff.length() / touchDiffOnHold.length()))
  }
},
touchend: function (event) {
  event.preventDefault();

    // reset original object scale
  pinchScale.copy(obj.scale)
}

Demo

答案 2 :(得分:1)

C ++中的

struct基本上是class es。因此,他们可以拥有成员职能。请阅读this,了解有关两者之间差异的更多信息。

  

然而,我的老师告诉我,我们内部没有功能   结构。

在谈到C时,这是正确的.C只允许将数据存储在struct中。您可以做的最好的事情是将函数指针存储在struct