【问题标题】:how to initialize string[20] in the constructor?如何在构造函数中初始化字符串[20]?
【发布时间】:2021-09-10 14:03:44
【问题描述】:

好的,我已经编辑了代码。当输入数据部分出现输出屏幕时出现问题。它需要所有者名称,但之后立即崩溃。(问题中的 ps,house 应该有一个 100 obj 的数组),我还想问是否有办法修复字符串大小,以便用户只能输入名称20码以内?


class House
{
private: 
    string owner;
    string address;
    int bedrooms;
    float price;
public:
    
    House(string owner="", string address="", int bedrooms = 0, float price = 0.0)
    {
        this->owner = owner;
        this->address = address;
        this->bedrooms = bedrooms;
        this->price = price;

    }
    void setOwner(string owner)
    {
        this->owner = owner;
    }
    void setAddress(string address)
    {
        this->address = address;
    }
    void setBedrooms(int bedrooms)
    {
        this->bedrooms = bedrooms;
    }
    void setPrice(float price)
    {
        this->price = price;
    }
    string getOwner()
    {
        return owner;
    }
    string getAddress()
    {
        return address;
    }
    int getBedrooms()
    {
        return bedrooms;
    }
    float getPrice()
    {
        return price;
    }
    void getData()
    {
        cout << "Enter Owner : ";
        cin >> owner;
        setOwner(owner);
        cout << "Enter Addres : ";
        cin >> address;
        setAddress(address);
        cout << "Number of Bedrooms? : ";
        cin >> bedrooms;
        setBedrooms(bedrooms);
        cout << "Price : ";
        cin >> price;
        setPrice(price);
        cout << endl;
    }
    void display()
    {
        cout << "Owner \t Address \t Bedrooms \t Price" << endl;
        cout << getOwner() << "\t" << getAddress() << "\t" << getBedrooms() << "\t" << getPrice() << "\t" << endl;

    }
};
int main()
{

    House *h[100] ;
    
    int time=0;
    char yesorno;
    do
    {

        h[time]->getData();
        h[time]->display();
        
        cout << "Do you wish to continue ?";
        cin >> yesorno;
        time++;
    } while (yesorno == 'y' || yesorno =='Y');
    return 0;
}

【问题讨论】:

  • 您真的要允许 20 位业主拥有一个房子吗?房子有20个地址?我认为每个房子都应该有 1 个地址。
  • 如果最大长度是 20,那么你的 C 字符串的长度应该是 21。但这很奇怪,我不明白为什么你不能在 最低。也就是说,如果您坚持使用 C 字符串而不是 std::string。我能想到很多不适合 19 个字符的地址。
  • 我收到错误“没有类 House 的默认构造函数” 这与您对数组的不当使用完全无关。要使用House houseinfo;,因为您没有传递所需的参数,编译器会要求您声明一个默认构造函数:House()
  • string owner[20]; -- 您的代码令人困惑。你的意思是每栋房子最多有 20 个业主,还是一个业主的名字可以有 20 个字符?如果是后者,则此声明与描述不符。也许困惑是您认为std::string 只能包含一个字符?
  • 我认为你的教授希望你使用 c-strings 而不是正确的 c++ std::string。

标签: c++ oop


【解决方案1】:

找不到默认构造函数的错误很简单。您创建了 a 构造函数,它去掉了编译器提供的默认值。然后,由于您没有提供默认值,因此当您尝试声明对象 houseinfo 时会出现此错误。

仅修复该错误只需要一个默认构造函数。这是您班级的一个版本:

class House {
 private:
  std::string owner;
  std::string address;
  int bedrooms = 0;  // CHANGE: Default member initialization
  float price = 0.0f;  // NOTE: 0.0 is a double

 public:
  House() = default;  // CHANGE: Add default constructor

  // CHANGE: Got rid of default values in parameterized ctor
  House(std::string owner, std::string address, int bedrooms, float price)
      : owner(owner), address(address), bedrooms(bedrooms), price(price) {}
  void setOwner(std::string owner) { this->owner = owner; }
  void setAddress(std::string address) { this->address = address; }
  void setBedrooms(int bedrooms) { this->bedrooms = bedrooms; }
  void setPrice(float price) { this->price = price; }
  std::string getOwner() const { return owner; }
  std::string getAddress() const { return address; }
  int getBedrooms() const { return bedrooms; }
  float getPrice() const { return price; }
};

我使用了默认成员初始化,在 private 部分中可以看到。这使得编写默认构造函数变得微不足道,正如您在 House() = default; 行中看到的那样。这两个功能都需要 C++11。

我删除了所有 [20] 的东西,因为您使用的是 std::string。您声明了一个 std::string 对象数组,而不是容量为 20 的单个字符串。即使打算使用字符串数组,您也几乎在每个实例中都错误地使用了它。

这是使用 C 字符串的类的一个版本。它更丑陋,并且缺少许多现在必须手动完成的错误检查。如果我们真的进入它,使用strncpy() 不再被认为是好的做法,但我不相信C++ 提供了strlcpy()。一般来说,std::string 会好很多,尽管它可能不完美。

class House {
 private:
  static const int arrSize = 20;
  char owner[arrSize]{0};
  char address[arrSize]{0};
  int bedrooms = 0;
  float price = 0.0f;

 public:
  House() = default;

  House(char owner[], char address[], int bedrooms, float price)
      : bedrooms(bedrooms), price(price) {
    std::strncpy(this->owner, owner, arrSize - 1);
    std::strncpy(this->address, address, arrSize - 1);
  }

  void setOwner(char owner[]) {
    std::strncpy(this->owner, owner, arrSize - 1);
  }

  void setAddress(char address[]) {
    strncpy(this->address, address, arrSize - 1);
  }
  
  void setBedrooms(int bedrooms) { this->bedrooms = bedrooms; }
  void setPrice(float price) { this->price = price; }
  const char* getOwner() const { return owner; }
  const char* getAddress() const { return address; }
  int getBedrooms() const { return bedrooms; }
  float getPrice() const { return price; }
};

就这样解决了所有问题,我不知道您在 main() 函数中尝试做什么。您的h-&gt;houseinfo; 行毫无意义。我也不知道为什么你需要一个指向House的指针数组。

【讨论】:

  • 我不确定 arrSize 是否应该是 20 或 21 来说明空终止。这取决于家庭作业的确切措辞。话虽如此,这段代码很容易改变。
  • 好收获。我实际上评论了它可能应该是 21 的问题。不过,我会保持原样。
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2010-11-28
  • 2013-11-17
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多