Ошибка конструктора C ++.Не удается инициализировать массив строк - PullRequest
1 голос
/ 01 августа 2010

Почему не удается инициализировать мой массив строк в конструкторе?Я получаю следующую ошибку: внутренняя ошибка компилятора: Ошибка сегментации |

в этих двух строках в конструкторе: костюмы = {"Клубы", "Алмазы", "Сердца", "Пики"};denominations = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "Король"};

class Card
    {
      public:
        Card(int n);
        Card(string d, string s);
        int getNumber();
        string getDenomination();
        string getSuit();
        void setNumber(int n);
        void setDenomination(string d);
        void setSuit(string s);
        void printMe();
        void compareMe(Card c);

      private:
        int number;
        string denomiation;
        string suit;
        string suits [4];
        string denominations [13];
    };


    Card::Card(int n)
    {
        suits = {"Clubs", "Diamonds", "Hearts", "Spades"};
        denominations = {"Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"};

        int denIndex, suitIndex;

        denIndex = 51 % 13;
        suitIndex = 51 / 13;

        number = n;
        denomiation = denominations[denIndex];
        suit = suits[suitIndex];

    }

Ответы [ 4 ]

5 голосов
/ 01 августа 2010

Из кода, который вы разместили, я полагаю, что символы suits и denominations должны быть статическими членами данных, то есть они всегда будут иметь одинаковые данные для каждого Card экземпляра.

Поэтому я предлагаю вам сделать их статичными и инициализировать их в области видимости файла в вашем cpp-файле (вне объявления вашего класса):

Декларация:

class Card
{
  public:
    Card(int n);
    Card(string d, string s);
    int getNumber();
    string getDenomination();
    string getSuit();
    void setNumber(int n);
    void setDenomination(string d);
    void setSuit(string s);
    void printMe();
    void compareMe(Card c);

  private:
    int number;
    string denomiation;
    string suit;
    static const string suits [4];                 // static const
    static const string denominations [13];        // static const
};

Определение:

const string Card::suits[4] = {"Clubs", "Diamonds", "Hearts", "Spades"};
const string Card::denominations[13] = {"Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"};

EDIT: Как заявил Роберт С. Барнс, сделать их static const еще лучше.

Надеюсь, это поможет.

4 голосов
/ 01 августа 2010

Если вы получаете ICE (внутренняя ошибка компилятора), то вам действительно следует сообщить о коде тому, кто написал ваш компилятор.Предполагается, что компиляторы выводят предупреждения и ошибки, но не ошибки сегментации.

4 голосов
/ 01 августа 2010

При построении можно использовать только инициализацию литерального массива, но не присваивание.

int good[3] = { 1, 2, 3 }; // OK
int bad[3];
bad = { 1, 2, 3 }; // not so good

Вам придется скопировать массив вручную (или использовать контейнер типа vector или boost::array.

3 голосов
/ 01 августа 2010

используйте std::vector или boost::array, упрощенный пример вашего кода ниже

#include <boost/assign/list_of.hpp>

#include <boost/array.hpp>

#include <iostream>
#include <string>

class Card
{
public:
    explicit Card( unsigned n ) :
        _number( n ),
        _suits( boost::assign::list_of( "Clubs" )( "Diamonds" )( "Hearts" )( "Spades" ) ),
        _denominations( boost::assign::list_of( "Ace" )( "2" )( "3" )( "4" )( "5" )( "6" )( "7" )( "8" )( "9" )( "10" )( "Jack" )( "Queen" )( "King" ) )
    {

    }

private:
    unsigned _number;
    boost::array<std::string, 4> _suits;
    boost::array<std::string, 13> _denominations;
};

int
main()
{
    Card foo( 5 );

    return 0;
}
...