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 回答
3

为了完整起见,这里是您可以更接近原始代码的方法(例如,正如有人建议的那样,如果您因为某些淫秽原因而不能使用 std::string)。这在很大程度上是矫枉过正且非常不典型的代码,但是嘿:)

template <size_t Lnaz, size_t Limi>
Student(int nr_ID, char const (&nazwisko)[Lnaz], char const (&imie)[Limi], double punkty)
    : nr_ID(nr_ID), punkty(punkty), next(nullptr)
{
    static_assert(Lnaz <= sizeof(this->nazwisko)/sizeof(*this->nazwisko), "too large");
    static_assert(Limi <= sizeof(this->imie)/sizeof(*this->imie), "too large");

    std::copy(nazwisko, nazwisko+Lnaz, this->nazwisko);
    std::copy(imie, imie+Limi, this->imie);
}

笔记

  • 这允许字符串包含嵌入的 NUL 字符。
  • 诀窍是通过引用传递数组,以避免其他人描述的衰减到指针
  • 此外,模板在那里是因为"hello"将是char const (&)[6],并且"bye"将是char const (&)[4]- 不同的参数类型

在http://liveworkspace.org/code/2rxQrg$1上实时查看

于 2013-04-09T15:13:11.810 回答
1

您可以通过替换char数组来简化问题std::string(或者std::vector<char>如果您的char数组不包含以空字符结尾的字符串):

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

您没有确定nazwisko存储字符串或字符序列!

我假设,这是一个字符序列。(不是 C 风格的字符串)

使用std::memcpystd::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)

您可能需要考虑添加额外的大小参数来确定传递给第二个和第三个参数中的函数的内存块有多大。如果它们是纯字符串,您可以使用它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 回答
0

要复制 c 风格的字符数组,需要使用strcpy函数。

在 C++ 中,请使用std::string类。其他一切都是等待发生的错误。

我刚刚注意到你有一个下一个指针。如果这不是链表的家庭作业,请考虑改用std::liststd::vector之类的容器。

于 2013-04-09T14:57:12.583 回答