Определение карт в классе - PullRequest
1 голос
/ 18 марта 2012

Я новичок в C ++ и не могу правильно определить карты в определении класса.

Вот код, который я написал:

#include<stdio.h>
#include <iostream>
#include <map>
#include <utility> // make_pair
#include <string.h>
#include <sstream>

using namespace std;

class assgnt
{
private:
    //typedef std::map<int, int> MapType;
    //MapType my_map;
public:
    bool isGoodPoint(int x, int y);
    void addGoodNeighbours(int x, int y);

};

inline bool assgnt::isGoodPoint(int x, int y)
{
    string xs, ys;
    stringstream xout, yout;
    int xsum=0, ysum=0;

    xout<<x; yout<<y;

    xs = xout.str();
    ys = yout.str();

    for each (char c in xs)
    {
        xsum = xsum + int(c);
    }

    for each (char c in ys)
    {
        ysum = ysum + int(c);
    }

    if (xsum+ysum <= 19)
        return true;
    else 
        return false;
}

inline void assgnt::addGoodNeighbours(int x, int y)
{
    //if assgnt::isGoodPoint(x+1,y)
    if(isGoodPoint(x+1,y))
    {

    }
    /*if isGoodPoint(x+1,y) and [x+1,y] not in points: points.append([x+1,y])
    if isGoodPoint(x-1,y) and [x-1,y] not in points: points.append([x-1,y])
    if isGoodPoint(x,y+1) and [x,y+1] not in points: points.append([x,y+1])
    if isGoodPoint(x,y-1) and [x,y-1] not in points: points.append([x,y-1])*/
}


int main()
{

   typedef std::map<int, int> MapType;
    MapType my_map;

    // insert elements using insert function
    my_map.insert(std::pair<int, int>(0, 0));

    int i=0;

    while true
    {


    //my_map.insert(std::pair<int, int>(2, 2));
    //my_map.insert(std::pair<int, int>(3, 3));
    //my_map.insert(MapType::value_type(4, 4)); // all standard containers provide this typedef
    //my_map.insert(std::make_pair(5, 5));      // can also use the utility function make_pair

    MapType::iterator iter = my_map.begin();

    std::cout << "Size of my_map: " << my_map.size() << '\n';

    std::cout << "Enter a key to search for: ";
    int c;
    std::cin >> c;

    iter = my_map.find(c);
    if (iter != my_map.end()) 
    {
        int num = iter->second;
        if(num == 0)
            std::cout << "Value is found: " << iter->second << '\n';
        else 
            std::cout << "Value not found: ";
    }
    else
        std::cout << "Key is not in my_map" << '\n';

//    my_map.clear();
}

Я хочу определить карту typedef std :: map MapType; в определении класса, чтобы я мог использовать его во всех встроенных функциях и main (), создав его объект.

Пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 18 марта 2012

Ваш while цикл содержит ошибку: это должно быть

while(true)
{
    //...
}

Цикл Infinete - плохая идея (ваша программа не прекратит работу) - вы не кодировали никаких условных выражений, таких как

while(true)
{
    //...
    if(some_condition)
        break;
}

Вам необходимо сделать ваше поле my_map общедоступным, чтобы вы могли получить к нему доступ из main (а также из других процедур).

И, наконец, создать экземпляр вашего класса:

int main()
{
    assgnt obj;
    //...
    // now write obj.my_map instead of just my_map
}
0 голосов
/ 18 марта 2012

Похоже, ваши проблемы с компиляцией связаны не с вашей картой, а с вашим синтаксисом while:

-while true
+while(true)
{

+}
0 голосов
/ 18 марта 2012

Чтобы ваш код заработал, вам нужно решить несколько проблем:

  1. Вашему классу нужен общедоступный конструктор
  2. Сделайте вашу карту общедоступной.
  3. При использовании вашей карты вне класса используйте тип assgnt :: MapType

. Это даст вам рабочий код, чтобы вы могли попробовать все, что вы делаете.Я думаю, что это был твой вопрос?Что вы не могли заставить его работать внутри класса?

В вашем коде есть несколько других ошибок, но вы должны быть в состоянии разобраться с ними;)

0 голосов
/ 18 марта 2012

Полагаю, вы хотите использовать его вне класса? Определите это в публичном разделе и будьте счастливы. Typedefs абсолютно безопасны с точки зрения инкапсуляции, они просто синонимы. Тогда вы можете использовать его в main как assgnt::MapType.

...