c ++:如何在不创建对象的情况下调用main函数中的方法

时间:2018-07-01 09:28:41

标签: c++

我有以下课程:

class Vector
{
public:
    float x_;
    float y_;
    float z_;

    Vector(float x, float y, float z) : x_(x), y_(y), z_(z) {}
    float scalar(Vector a, Vector b);
};

和以下方法:

float Vector::scalar(Vector a, Vector b)
{
  return a.x_ * b.x_ + a.y_ * b.y_ + a.z_ * b.z_;
}

现在我要在主要功能中初始化Vector aVector b

int main()
{
  Vector a = Vector(1,2,3);
  Vector b = Vector(4,5,6);

  float result;
  // how can I call the scalar() method and save the return value in result

  return 0;
}

但是现在我想知道如何调用scalar()方法。我试图将scalar()声明为静态,但是没有用。

6 个答案:

答案 0 :(得分:4)

与某些其他语言不同,C ++允许您使用不是类成员的函数。您可以只在Vector外部定义函数,然后在不带对象前缀的情况下调用它。

class Vector
{
public:
    float x_;
    float y_;
    float z_;

    Vector(float x, float y, float z) : x_(x), y_(y), z_(z) {}
};

float scalar(Vector a, Vector b)
{
  return a.x_ * b.x_ + a.y_ * b.y_ + a.z_ * b.z_;
}

int main()
{
  Vector a(1,2,3);
  Vector b(4,5,6);

  float result = scalar(a, b);

  return 0;
}

答案 1 :(得分:3)

您可以做的是将您的方法创建为静态方法。它的作用与使用类名命名方法的作用相同。

class Vector
{
public:
    float x_;
    float y_;
    float z_;

    Vector(float x, float y, float z) : x_(x), y_(y), z_(z) {}
    static float scalar(Vector a, Vector b);
};

您可以在主体中通过以下方式调用

int main()
{
  Vector a = Vector(1,2,3);
  Vector b = Vector(4,5,6);

  float result = Vector::scalar(a, b);
  return 0;
}

答案 2 :(得分:2)

您需要将标量定义为静态并将其作为静态方法调用:

class Vector
{
    ...

    static float scalar(Vector a, Vector b);
};

auto result = Vector::scalar(a,b);

答案 3 :(得分:0)

怎么样?

float Vector::scalar(const Vector& other)
{
  return x_ * other.x_ + y_ * other.y_ + z_ * other.z_;
}

int main()
{
  Vector a(1,2,3);
  Vector b(4,5,6);

  float result = a.scalar(b);

  return 0;
}

答案 4 :(得分:0)

我的第一个答案提供了2个选择,可以避免更改您拥有的任何类代码。基本原理:大多数专业程序员都参与的一项活动(ahem,“ assigned”)是a)添加功能,b)响应需求的变化。当然,还有c)编码错误的“解决方案”。如果您将对现有代码的影响最小化,那么您的工作量将更少(因此可以更快完成,从而得到更好的回报)。

此答案建议在现有的Vector类中添加2行,

  1. 添加默认ctor(注意-默认ctor和dtor不执行任何操作)
  2. 添加operator()

这两个1衬里添加项使您可以将该类用作函子。

从Google使用C ++函子:

  

函子(或函数对象)是一种C ++类,其行为类似于   功能。使用相同的旧函数调用语法来调用函子。   要创建函子,我们创建一个使operator()重载的对象。

     

C ++中的函数-GeeksforGeeks   https://www.geeksforgeeks.org/functors-in-cpp/


class Vector
{
public:

   // ... as above


   // functor style access:
   Vector() = default;                   // default ctor
   float operator()(Vector a, Vector b) { return scalar(a,b); } // operator()

}; // class Vector
  

如何调用scalar()方法?

通过函子:

int main()
{
  Vector a = Vector(1,2,3);
  Vector b = Vector(4,5,6);

  float result = Vector()(a,b);

  std::cout << "\n\n  " << result 
            <<   "      even more convenient: " << Vector()(a, b) << std::endl;

  return 0;
}

答案 5 :(得分:-1)

您微不足道...

由于ctor和dtor是“琐碎的”,因此您可以简单地实例化伪向量,并使用该伪的标量方法。

但是,如果您无法降低ctor / dtor的成本,或者您知道自己将逐渐增加其行为,则也可以使用任何现有的Vector。请注意,方法Vector :: scalar()对本地数据没有任何作用。因此,不需要“静态”。无需更改代码。

int main()
{
  Vector a = Vector(1,2,3);
  Vector b = Vector(4,5,6);

  // instantiate a dumy vector
  float result1 = Vector(0, 0, 0).scalar(a,b);  // dummy Vector

  // use an existing vector
  float result2 = a.scalar(a,b);  // method scalar does not modify self.

  std::cout << "\n\n  " << result1 << "  " << result2 << std::endl;

  return 0;
}

两个结果相同,即32