0

大家,我需要帮助将 Java 中的一些代码转换为 C++。如何将类实例化为从 Java 到 C++ 的私有类型?这就是我的意思,我是几行代码:

第一个问题:解决了。

第二个问题:这个java代码是我想转换的,你认为我的代码有什么问题?

Java中的原始代码:

public class ClueReasoner 
{
private int numPlayers;
private int playerNum;
private int numCards;
private SATSolver solver;    
private String caseFile = "cf";
private String[] players = {"sc", "mu", "wh", "gr", "pe", "pl"};
private String[] suspects = {"mu", "pl", "gr", "pe", "sc", "wh"};
private String[] weapons = {"kn", "ca", "re", "ro", "pi", "wr"};
private String[] rooms = {"ha", "lo", "di", "ki", "ba", "co", "bi", "li", "st"};
private String[] cards;

public ClueReasoner()
{
    numPlayers = players.length;

    // Initialize card info
    cards = new String[suspects.length + weapons.length + rooms.length];
    int i = 0;
    for (String card : suspects)
        cards[i++] = card;
    for (String card : weapons)
        cards[i++] = card;
    for (String card : rooms)
        cards[i++] = card;
    numCards = i;

    // Initialize solver
    solver = new SATSolver();
    addInitialClauses();
}

private int getPlayerNum(String player) 
{
    if (player.equals(caseFile))
        return numPlayers;
    for (int i = 0; i < numPlayers; i++)
        if (player.equals(players[i]))
            return i;
    System.out.println("Illegal player: " + player);
    return -1;
}

private int getCardNum(String card)
{
    for (int i = 0; i < numCards; i++)
        if (card.equals(cards[i]))
            return i;
    System.out.println("Illegal card: " + card);
    return -1;
}

private int getPairNum(String player, String card) 
{
    return getPairNum(getPlayerNum(player), getCardNum(card));
}

private int getPairNum(int playerNum, int cardNum)
{
    return playerNum * numCards + cardNum + 1;
}    

我的代码:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

void Scene_Reasoner() {
int numPlayer;
int playerNum;
int cardNum;
 string filecase = "Case: ";
 string players [] = {"sc", "mu", "wh", "gr", "pe", "pl"};
 string suspects [] = {"mu", "pl", "gr", "pe", "sc", "wh"};
string weapons []  = {"kn", "ca", "re", "ro", "pi", "wr"};
 string rooms[] = {"ha", "lo", "di", "ki", "ba", "co", "bi", "li", "st"};
 string cards [0];
};

void Scene_Reason_Base () {
    numPlayer = players.length;

    // Initialize card info
    cards = new String[suspects.length + weapons.length + rooms.length];
    int i = 0;
    for (String card : suspects)
        cards[i++] = card;
    for (String card : weapons)
        cards[i++] = card;
    for (String card : rooms)
        cards[i++] = card;
    cardNum = i;
    };

    private int getCardNum (string card) {
            for (int i = 0; i < numCards; i++)
        if (card.equals(cards[i]))
            return i;
    cout << "Illegal card: " + card <<endl;
    return -1;
    };

     private int getPairNum(String player, String card)
   {
    return getPairNum(getPlayerNum(player), getCardNum(card));
};

  private int getPairNum(int playerNum, int cardNum)
  {
    return playerNum * numCards + cardNum + 1;
};

int main () {
return 0;
}
4

3 回答 3

1

您是否在 C++ 中实现了 SATSolver?如果是这样,有一个示例代码:

class Foo
{
private:
    int numPlayers;
    int playerNum;
    int numCards;
    SATSolver solver;

    // etc
};
于 2012-09-08T12:17:09.630 回答
1

如果你想做的是SATSOlver在另一个类中声明一个私有实例,你可以这样做:

文件 SATSolver.h

class SATSolver {
// methods, members, etc....
};

文件 Foo.h

#include "SatSolver.h" // get the SATSolver declaration

class Foo
{

 private: // everything that follows is private access

  SATSolver solver;

 public: // from here on, everything is public
  // more code

 private: // and now, all that follows is private again
  // stuff
}

请注意,在 C++ 中,访问说明符只允许在类或结构中使用。您不能将它们包含在函数内部,也不能将它们放在类或结构之外的限定类型或值。

请注意,在 C++ 中,class默认情况下 a 具有私有访问权限(和继承,但这超出了此问题的范围):

class Bar {
  SATSolver solver; // private
}
于 2012-09-08T12:17:10.877 回答
0

您的代码破坏了我们的转换器 - 我们修复了它,可编译的 C++ 等价物如下:

#include <string>

class ClueReasoner
{
private:
    int numPlayers;
    int playerNum;
    int numCards;
    SATSolver *solver;
    std::string caseFile;
    std::string players[6];
    std::string suspects[6];
    std::string weapons[6];
    std::string rooms[9];
//ORIGINAL LINE: private String[] cards;
//JAVA TO C++ CONVERTER WARNING: Since the array size is not known in this declaration, Java to C++ Converter has converted this array to a pointer.  You will need to call 'delete[]' where appropriate:
    std::string *cards;

public:
    ClueReasoner()
    {
        InitializeInstanceFields();
        numPlayers = sizeof(players) / sizeof(players[0]);

        // Initialize card info 
        cards = new std::string[sizeof(suspects) / sizeof(suspects[0]) + sizeof(weapons) / sizeof(weapons[0]) + sizeof(rooms) / sizeof(rooms[0])];
        int i = 0;
        for (std::string::const_iterator card = suspects->begin(); card != suspects->end(); ++card)
            cards[i++] = *card;
        for (std::string::const_iterator card = weapons->begin(); card != weapons->end(); ++card)
            cards[i++] = *card;
        for (std::string::const_iterator card = rooms->begin(); card != rooms->end(); ++card)
            cards[i++] = *card;
        numCards = i;

        // Initialize solver 
        solver = new SATSolver();
        addInitialClauses();
    }

private:
    int getPlayerNum(const std::string &player)
    {
        if (player == caseFile)
            return numPlayers;
        for (int i = 0; i < numPlayers; i++)
            if (player == players[i])
                return i;
        std::cout << "Illegal player: " + player << std::endl;
        return -1;
    }

    int getCardNum(const std::string &card)
    {
        for (int i = 0; i < numCards; i++)
            if (card == cards[i])
                return i;
        std::cout << "Illegal card: " + card << std::endl;
        return -1;
    }

    int getPairNum(const std::string &player, const std::string &card)
    {
        return getPairNum(getPlayerNum(player), getCardNum(card));
    }

    int getPairNum(int playerNum, int cardNum)
    {
        return playerNum * numCards + cardNum + 1;
    }

    void InitializeInstanceFields()
    {
        caseFile = "cf";
        std::string temp_players[6] = {"sc", "mu", "wh", "gr", "pe", "pl"};
        for (int element = 0; element < sizeof(temp_players) / sizeof(temp_players[0]); element++)
            players[element] = temp_players[element];
        std::string temp_suspects[6] = {"mu", "pl", "gr", "pe", "sc", "wh"};
        for (int element = 0; element < sizeof(temp_suspects) / sizeof(temp_suspects[0]); element++)
            suspects[element] = temp_suspects[element];
        std::string temp_weapons[6] = {"kn", "ca", "re", "ro", "pi", "wr"};
        for (int element = 0; element < sizeof(temp_weapons) / sizeof(temp_weapons[0]); element++)
            weapons[element] = temp_weapons[element];
        std::string temp_rooms[9] = {"ha", "lo", "di", "ki", "ba", "co", "bi", "li", "st"};
        for (int element = 0; element < sizeof(temp_rooms) / sizeof(temp_rooms[0]); element++)
            rooms[element] = temp_rooms[element];
    }
};
于 2012-09-08T23:53:22.357 回答