2012-09-08 49 views
0

大家好,我需要帮助将Java中的一些代码转换为C++。我如何将类实例化为从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; 
} 

回答

1

你有执行SATSolver在C++?如果是这样,有一个示例代码:

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

    // etc 
}; 
+0

感谢您的支持。我将研究这部分。我在这个程序中遇到了另一个问题,不幸的是:( – Xelza

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有私人通道(和继承,但超出了这个问题的范围),默认为:

class Bar { 
    SATSolver solver; // private 
} 
+0

@jrok编辑了答案。 – juanchopanza

+0

谢谢!还有另外一个问题我想出来,在我看来,私人和公众并没有像我想的那样出现。正确的语法,使他们私人和公共,但...我失败了,你能帮助我更多的这个问题,先生? – Xelza

+0

@ Xelza你可以添加一些小的代码片段来说明如何和失败? – juanchopanza

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]; 
    } 
}; 
+0

我可以知道你为武器指定的std :: string是什么...等等? 也,你在std :: cout中使用它...这是什么意思?谢谢。 – Xelza

+0

我只是使用完整的资格 - “std :: string”而不是“string”和“std :: cout”而不是“cout”。使用“使用命名空间标准”你不需要这样做,但我想指定“标准”,使其在代码中显而易见。 –