0

オブジェクトの属性を初期化したいのですが、タイプの不一致を言い続けています。それを修正する方法は?

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;
class Student{
public:
    int nr_ID;
    char nazwisko[40];
    char imie[40];
    double punkty;
    Student* next;

    Student(int nr_ID, char nazwisko[40], char imie[], double punkty){
        this->nr_ID = nr_ID;
        this->nazwisko = nazwisko;//HERE
        this->imie = imie;//HERE
        this->punkty = punkty;
        next = NULL;
    }

    ~Student(){}

};
4

6 に答える 6

5

配列型引数のようなものはありません。宣言したその引数char nazwisko[40]は、実際にはポインター型に変換されますchar* nazwisko。これで、ポインタを配列に割り当てようとしていることがわかります。もちろん、それはうまくいきません。

実際、配列を互いに単純に割り当てることはまったくできません。必要に応じて要素をコピーする必要があります。C 関数strcpyを使用してそれを行うことができます。これは、引数が C スタイルの文字列であることを考慮に入れます。配列全体をコピーしたい場合は、std::copy.

std::string実際にテキストの文字列を操作している場合は、標準型を使用してこれを行う方がはるかに優れています。の配列よりも、渡したり割り当てたりするのがはるかに簡単ですchar

std::string nazwisko;
std::string imie;
// ...

Student(int nr_ID, std::string nazwisko, std::string imie, double punkty){
    this->nazwisko = nazwisko;
    this->imie = imie;
    // ...
}

実際、これらのメンバー変数をデフォルトで初期化してから、コンストラクター メンバー初期化リストを使用してそれらに代入するという手間を省くことができます。

Student(int nr_ID, std::string nazwisko, std::string imie, double punkty)
  : nr_ID(nr_ID), nazwisko(nazwisko), imie(imie), punkty(punkty), next(NULL)
{ }
于 2013-04-09T14:57:44.970 に答える
1

char配列を次のように置き換えることで問題を単純化できますstd::string(またはstd::vector<char>char配列に null で終了する文字列が含まれていない場合)。

class Student{
public:
  int nr_ID;
  std::string nazwisko;
  std::string imie;
  double punkty;
  Student* next;

  Student(int nr_ID, 
          const std::string& nazwisko, 
          const std::string& imie, 
          double punkty)
    : nr_ID(nr_ID), nazwisko(nazwisko), imie(imie), punkty(punkty), next(NULL)
  {}
};
于 2013-04-09T14:58:24.663 に答える
0

C スタイルの文字配列をコピーするには、 strcpy関数を使用する必要があります。

C++ では、std::stringクラスを使用してください。他のすべては、起こるのを待っているバグです。

次のポインタがあることに気付きました。これが連結リストの宿題ではない場合は、代わりにstd ::liststd::vectorなどのコンテナーを使用することを検討してください。

于 2013-04-09T14:57:12.583 に答える
0

nazwisko文字列または一連の文字列が格納されていると判断できませんでした!

私は、それは一連の文字だと思いました。(C スタイルの文字列ではありません)

std::memcpyまたは_std::copy

 Student(int nr_ID, char nazwisko[40], char imie[], double punkty){
        //...
        std::memcpy(this->nazwisko, nazwisko, 40);

        or

        std::copy(nazwisko, nazwisko+40, this->nazwisko);
        //...
    }
于 2013-04-09T14:58:37.803 に答える
0

配列を別の配列に割り当てることはできず(これはあなたが望んでいたように見えます)、配列にポインターを割り当てることもできません(これはあなたが試みていることです)。要素をコピーする必要があります。

関数シグネチャで、その関数を呼び出すと、配列はポインターに減衰します。通常、コンパイラーが処理するようにコードを表示すると、コードが読みやすくなります。コンストラクターの署名は次のとおりです。

Student(int nr_ID, char *nazwisko, char *imie, double punkty)

2 番目と 3 番目の引数で関数に渡されるメモリ ブロックの大きさを判断するために、余分なサイズ引数を追加することを検討することをお勧めします。それらがプレーン文字列の場合strncpy、配列メンバーを初期化するために使用できます。

Student(int nr_ID, 
        char const *nazwisko, // make it 'const' you don't modify the argument
        char const *imie,     // same here
        double punkty)
   : nr_ID(nr_ID), punkty(punkty)       // prefer initializer lists
{
   strncpy(this->nazwisko, nazwisko, 39); this->nazwisko[39] = 0;
   strncpy(this->imie,     imie,     39); this->imie[39] = 0;
}
于 2013-04-09T15:03:05.930 に答える