2012-05-02 6 views
9

У меня возникли проблемы с объявлением и инициализацией массива символов. Он всегда отображает случайные символы. Я создал меньший кусок кода, чтобы показать, что я пытаюсь в моей большой программе:Как инициализировать массивы char в конструкторе?

class test 
{ 
    private: 
     char name[40]; 
     int x; 
    public: 
     test(); 
     void display() 
     { 
      std::cout<<name<<std::endl; 
      std::cin>>x; 
     } 
}; 
test::test() 
{ 
    char name [] = "Standard"; 
} 

int main() 
{ test *test1 = new test; 
    test1->display(); 
} 

И жаль, если мое форматирование плохо, я могу только выяснить этот сайт не говоря уже о том, как исправить мой код :(

+0

Связанный: [Как я могу использовать список инициализации члена для его инициализации?] (Http://stackoverflow.com/q/5602030/636019) – ildjarn

+0

Итак, теперь я использую std :: string, однако в большей программе это для того, чтобы я использовал функцию get, подобную этой : void get (char prompt [], int size, char b []), где char b [] был моим массивом char ранее. Как мне изменить это, чтобы передать строку моей функции get? – ShengLong916

+0

Верните объект 'std :: string' вместо' void'. – ildjarn

ответ

4

Поскольку вы используете C++, я предлагаю использовать строки вместо символьных массивов. в противном случае вы должны использовать STRCPY (или друзей).

Кроме того, вы забыли удалить test1 экземпляр.

#include <iostream> 
#include <string> 

class test 
{ 
    private: 
     std::string name; 
     int x; 
    public: 
     test(); 
     void display() 
     { 
      std::cout<<name<<std::endl; 
     } 
}; 

test::test() 
{ 
    name = "Standard"; 
} 

int main() 
{ 
    test test1; 
    test1.display(); 

    std::cin>>x; 
} 
+0

Спасибо, что вы, ребята, БОЛЬШИЕ! – ShengLong916

+1

прецедент для массивов char: C++ доступен в тех местах, где std lib нет, например, микроконтроллеры. –

5

Учитывая вы помечено вопрос, как C++, вы должны использовать std::string:

#include <string> 

class test 
{ 
    private: 
     std::string name; 
     int x; 
    public: 
     test(); 
     void display() 
     { 
      std::cout<<name<<std::endl; 
      std::cin>>x; 
     } 
}; 
test::test() : name("Standard") 
{ 

} 
+0

Большое вам спасибо, это очень помогло. – ShengLong916

+0

Я никогда не понимаю, как «одинаковые» ответы отправили _later_, чтобы получить больше очков. И мой ответ был, возможно (довольно много) более полным от get-go ... – sehe

+0

Я действительно не получаю этот сайт еще sehe, я попытался перевернуть оба, но не смог. Сожалею. – ShengLong916

6

Ваш конструктор не устанавливает переменную-член name, это объявить локальную переменную. Как только локальная переменная выходит из области видимости в конце конструктора, она исчезает. Между тем переменная-член все еще не инициализируется и заполняется случайным мусором.

Если вы собираетесь использовать старомодные массивы символов, вам также потребуется использовать старомодную функцию, например strcpy, для копирования в переменную-член. Если все, что вы хотите сделать, это установить его в пустую строку, вы можете инициализировать ее с помощью name[0] = 0.

9

Если нет особых причин не использовать std::string, используйте std::string.

Но если вам действительно нужно инициализировать этот элемент массива символов, то:

#include <assert.h> 
#include <iostream> 
#include <string.h> 
using namespace std; 

class test 
{ 
    private: 
     char name[40]; 
     int x; 
    public: 
     test(); 
     void display() const 
     { 
      std::cout<<name<<std::endl; 
     } 
}; 

test::test() 
{ 
    static char const nameData[] = "Standard"; 

    assert(strlen(nameData) < sizeof(name)); 
    strcpy(name, nameData); 
} 

int main() 
{ 
    test().display(); 
} 
+1

Я думаю, что «главное» тело немного загадочно, измеряя фазу обучения OP :) – sehe

+0

Итак, я решил использовать std :: string, но согласно моему комментарию выше, как бы передать строку в другую функцию ? – ShengLong916

2

фактически обеспечивает два способа сделать это. Вы можете указать член в строке объявления или использовать список инициализации конструктора.

Пример инициализации декларации строки:

class test1 { 
    char name[40] = "Standard"; 
public: 
    void display() { cout << name << endl; } 
}; 

Пример инициализации конструктора:

class test2 { 
    char name[40]; 
public: 
    test2() : name("Standard") {}; 
    void display() { cout << name << endl; } 
}; 

Вы можете увидеть живой пример обоих из них здесь: http://ideone.com/zC8We9

Мои личные предпочтения использовать инициализацию линии декларации, поскольку:

  1. Где никакие другие переменные не должны быть построены это позволяет генерируемый конструктор по умолчанию будет использоваться
  2. Если несколько конструкторов требуются это позволяет переменной быть инициализированы только в одном месте, а не во всех списках инициализации конструктора

Сказав все это, использование char[] может считаться повреждающим как сгенерированный оператор присваивания по умолчанию, а конструкторы копирования/перемещения не будут работать.Это может быть решена путем:

  1. Создание элемента const
  2. Использование char* (это не будет работать, если член будет держать что-нибудь, но буквенная строка)
  3. В общем случае следует предпочесть std::string
Смежные вопросы