как использовать strcopy в C ++ - PullRequest
1 голос
/ 12 декабря 2010

в c ++, у меня есть файл с именем «Student.h»

class LinkedList {
private: 

class Student {
public:

    int stId;
    char stName [20];
    char stMajor[20];
    double stAverage;
    Student * next;

    Student() {
        next = 0;
    }

    Student(int stId, char stName [20], char stMajor[20], double stAverage) {
        this.stId = stId;
        strcopy(this.stName, stName); // there is error here !
        strcopy(this.stMajor, stMajor);
        this.stAverage = stAverage;
    }

что мне делать ?!

Ответы [ 5 ]

7 голосов
/ 12 декабря 2010

this - это указатель в C ++, а не ссылка, как в Java. Плюс, что вам нужно, это strcpy() не strcopy()

Попробуйте это

    strcpy(this->stName, stName); 
    strcpy(this->stMajor, stMajor);

P.S: В C ++ всегда рекомендуется отдавать std::string массивам в стиле C

Гораздо более чистая версия вашего кода будет выглядеть примерно так

struct Student {

    int stId;
    std::string stName;
    std::string stMajor;
    double stAverage;
    Student * next;

    Student():stId(),stAverage(),next()//prefer initialization-list to assignment
    {
    }

    Student(int stId, const std::string &stName, const std::string &stMajor, double stAverage){
      this->stId = stId,
      this->stName = stName ,
      this->stMajor = stMajor,
      this->stAverage = stAverage;          
    }
};
2 голосов
/ 12 декабря 2010

что мне делать?!

Вы должны:

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

  • используйте std::list вместо того, чтобы придумывать свой собственный (за исключением целей изучения связанных списков).

  • не указывает размеры массива в формальных аргументах, как ваш char stName [20]; формальный тип аргумента не сохраняет информацию о размере, он просто передается типу указателя.

  • обычно избегайте прямого использования this.

  • обычно используют списки инициализаторов вместо присваиваний в теле конструктора.

Приветствия & hth.,

1 голос
/ 12 декабря 2010

Я думаю, вы имеете в виду функцию strcpy (без o ).

0 голосов
/ 12 декабря 2010

Разве вы не можете использовать std::string?

string s1, s2 = "example";
s1 = s2;

В любом случае, проблема в том, что в C ++ this возвращает указатель , поэтому this.stId неверный, правильныйформа будет this->stId или, альтернативно, (*this).stId.

0 голосов
/ 12 декабря 2010

this - это указатель, а не ссылка, поэтому вы должны использовать операторы разыменования указателя:

    strcpy(this->stName, stName);

или

    strcpy((*this).stName, stName);

Более того, я не рекомендую использовать char[20] в качестве типа данных для имен учеников - это очень подвержено ошибкам переполнения буфера. Вы можете преодолеть это с помощью strncpy

    strcpy(this->stName, stName, 19);
    this->stName[20]=0;

Но наиболее удобный способ - использовать std::string, который можно легко скопировать по назначению.

И, наконец, если вы выбрали какое-то соглашение для имен переменных-членов, вы можете просто ссылаться на них без this. Например:

class Student {
public:

    std::string m_stName;

...
    Student(int stId, std::string stName, ...) {
         m_stName=stName;

или даже (с использованием инициализаторов):

Student(int stId, std::string stName, ...) : m_stName(stName) {
     m_stName=stName;
...