0

したがって、私は C++ の初心者であり、動的言語のバックグラウンドを持っているため、これはおそらく初心者の質問です。私は古くからの演習を書こうとしていました。以下を参照してください。

class Person
{
public:
    Person(char n[], int a) {           
        name = n;
        age = a;
    }

    int age;
    char name[];

};

int main(int argc, char const *argv[])
{
    Person p("John", 25);
    return 0;
}

これはエラーをスローします:

main.cpp(8) : error C2440: '=' : cannot convert from 'char []' to 'char []'
        There are no conversions to array types, although there are conversions
to references or pointers to arrays

なぜ同じ型から変換する必要があるのですか? ちなみに、これは私の完全なコードと完全なエラーです。どんな助けでも大歓迎です!

4

5 に答える 5

3

という型がありますが、やや高度な話題char []不完全な配列型です。厳密モードでコンパイルしていた場合、コンパイラは不完全な配列をクラスメンバーにすることはできないと報告し、エラーを防ぐ必要があります。しかし、実際には、C++ によるメモリ割り当てが必要なため、C++ との互換性がほとんどない GCC 拡張機能に出くわしましたmalloc

とにかく、「ネイティブ」タイプではありませんが、C++ には確かにライブラリに可変長文字列があります。を含める必要があり<string>、それは と呼ばれstd::stringます。

#include <string>

class Person
{
public:
    Person(std::string n, int a) {           
        name = n;
        age = a;
    }

    int age;
    std::string name;

};

int main(int argc, char const *argv[])
{
    Person p("John", 25);
    return 0;
}
于 2013-09-05T00:51:46.420 に答える
1

配列は代入できません。各インデックスの要素を他のインデックスに繰り返しコピーする必要があります。文字配列の場合は、strcpy を使用できます。

int a[5], b[5];

a = b; // Error

配列のサイズを指定する必要があります。文字配列で作業する代わりにstd::stringを使用します。

于 2013-09-05T00:39:54.770 に答える
0

ここに私がg ++から得るエラーがあります

$ g++ -Wall example.cc -o example
example.cc: In constructor ‘Person::Person(char*, int)’:
example.cc:5:16: error: incompatible types in assignment of ‘char*’ to ‘char [0]’
example.cc: In function ‘int main(int, const char**)’:
example.cc:16:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

char n[]andchar name[]char *nandに置き換えるとchar *name、次のようになります。

$ g++ -Wall example.cc -o example
example.cc: In function ‘int main(int, const char**)’:
example.cc:16:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

この場合、コンパイラが 's を好む理由はわかりませんが、一般的に文字列を表す場合は 'schar*を使用する方が理にかなっています。char*

あなたは C++ で書いているので、std::stringよりもタイプセーフであるため、一般的に type が好まれchar*ます。これにより、コンパイルするコードがより堅牢になります。

そのすべてを念頭に置いて、次のコードを記述します

#include <string>

class Person
{
public:
    Person(std::string n, int a) {           
        name = n;
        age = a;
    }

    int age;
    std::string name;

};

int main(int argc, char const *argv[])
{
    Person p("Jack", 14);
    return 0;
}
于 2013-09-05T01:00:41.140 に答える