Javascript到C ++:对象等价?

时间:2017-04-25 20:09:32

标签: javascript c++

我的任务是将一些代码从javascript转换为C ++。虽然我对Javascript很熟悉,但我对C ++缺乏经验。

javascript代码大量使用对象。例如,以下代码用于将角度从度数转换为任何其他指定单位:

var allConversions = {
"Angle": {
    "degrees": {
        "degrees":function(inputNum) { return inputNum*1},
        "minutes":function(inputNum) { return inputNum*60},
        "radians":function(inputNum) { return inputNum*0.0174532925},
        "revolutions":function(inputNum) { return inputNum*0.00277777778},
        "seconds":function(inputNum) { return inputNum*3600},
    }
}

exports.convertUnits= function(unitType, inUnit, outUnit, inputVal) {
    return allConversions[unitType][inUnit][outUnit] (inputVal);
}

我想知道如何在C ++中创建类似的东西的最佳实践是什么?我应该尝试用结构或类创建类似的东西吗?

2 个答案:

答案 0 :(得分:1)

不完全确定所有下来的选票是什么。我认为你的问题没有错。

JavaScript是一种无类型语言,它有点......灵活的对象构造。根据实际代码,您有两个选项,并且您想要使用两者的混合。

选项1:创建课程

在这种情况下,您可以为特定数据结构创建一个类,其中包含您需要的每个值的属性。

当JavaScript对象在其所有用途中保持一致时使用此方法。

选项2:使用哈希地图

有各种不同的哈希映射类。您选择的是您使用的特定版本和框架。

无论如何,这些通常像JavaScript对象一样工作,您可以在其中创建键/值对。当您不太确定自己的数据是什么时,请使用此功能。

答案 1 :(得分:1)

取决于整体结构和上下文 - 您的代码段中缺少这些内容。也许,一个带有内联函数的简单类就可以了。但是,如果我必须尝试提供相同的代码,我必须写下这样的东西:

<强> someClass.hpp

#ifndef SOMECLASS_H
#define SOMECLASS_H

#include <string>

using std::string;

class degrees
{
    public:
        double inputVal;

        degrees(string, string, string, double); // a constructor

        double degreesFunc(double); // double?, can't have same name func
        double minutes(double);
        double radians(double);
        double revolutions(double);
        double seconds(double);
};

class Angle : public degrees
{
    public:
        Angle(string, string, string, double);
};

class allConversions : public Angle
{
    public:
        allConversions(string, string, string, double);
};

#endif /* SOMECLASS_H */

<强> someClass.cxx

#include "someClass.hpp"

degrees::degrees(
        string unitType,
        string inUnit,
        string outUnit,
        double inputVal)
{
    this->inputVal = inputVal;
}

double degrees::degreesFunc(double inputNum)
{
    return inputNum*1;
}

double degrees::minutes(double inputNum)
{
    return inputNum*60;
}

double degrees::radians(double inputNum)
{
    return inputNum*0.0174532925;
}

double degrees::revolutions(double inputNum)
{
    return inputNum*0.00277777778;
}

double degrees::seconds(double inputNum)
{
    return inputNum*3600;
}

//-------------------------------------------------

Angle::Angle(
        string a,
        string b,
        string c,
        double d)
    : degrees(a, b, c, d) { }

allConversions::allConversions(
        string a,
        string b,
        string c,
        double d)
    : Angle(a, b, c, d) { }

<强> TEST.CPP

#include <iostream>
#include "someClass.hpp"

using std::cout;

int main()
{
    allConversions convertUnits("what?", "what?", "what?", 10);

    cout << convertUnits.inputVal << '\n';
    cout << convertUnits.radians(10) << '\n';
    cout << convertUnits.minutes(10) << '\n';
}

使用带有Makefile的g ++进行编译:

all:
    g++ -c someClass.cxx
    g++ -c test.cpp
    g++ someClass.o test.o -o run

运行: ./run