【问题标题】:An array of char pointer & an array of string in C++C ++中的char指针数组和字符串数组
【发布时间】:2020-11-21 01:35:50
【问题描述】:

我想制作一个Class Color,并声明2个Class Color对象分别存储暖色和冷色列表。

如何初始化一个 char 指针数组并在 C++ 的构造函数中定义它?

.h

Const int MAX = 5;

Class Color {

  Char* list[MAX];
  Int numList;
}

.cpp

//default constructor
Color() {
  list[MAX] = nullptr;
  numList = 0;
}

//custom constructor
Color(char* list_, int numList_) {
  for (int i = 0; i < num_List_; i++) {
    list[i] = list_[i];
  }

  numList = numList_;
}

main.cpp

//declaring 2 objects of Class Color
Color warm_color;
Char warmList = {red, pink, orange, yellow, brown};

Color cold_color;
Char coldList = {“green”, “blue”, “navy”};

warm_color = Color(warmList, 5);
cold_color = Color(coldList, 3);

【问题讨论】:

  • 请贴出真实代码。要么你发明了一种叫做 Char 的东西,但完全没有描述它,或者你真的是指 char。如果您不发布实际上拥有的代码,您只会得到指出您发布的代码中的错误的答案,而不是您真正使用的代码中的错误。
  • 欢迎堆栈溢出。为什么要使用指向char 数组的指针?为什么不只是char list[MAX];?你知道std::string的存在吗
  • C++ 是一种区分大小写的语言。此外,您声明了 class Color 的方法,就好像您声明了普通函数一样。您需要使用方法的完整限定 ID,即Color::Color()
  • 你真的应该找一本好的 C++ 入门书
  • 除了所有语法错误和你的问题之外,一个名为 Color 的类应该模拟“颜色”而不是“颜色列表”,不使用误导性名称是必不可少的

标签: c++ arrays pointers constructor char


【解决方案1】:

您正在尝试存储可变长度字符串的可变长度列表。 C++ 在标准库中为此提供了非常有用的对象。

  • std::vector:可变长度列表,妥善管理。
  • std::string:一个可变长度的字符列表,所有都得到妥善管理。

这样您的代码可以简化为:

#include <vector>
#include <string>

class Colors {
private:
    std::vector<std::string> colorList;
public:
    Colors(std::vector<std::string> const& colorList) : colorList(colorList) {}
};

int main() {
    Colors warm_colors({ "red", "pink", "orange", "yellow", "brown" });
    Colors cold_colors({ "green", "blue", "navy" });
}

其实这种情况下构造函数可以用移动构造函数代替:

Colors(std::vector<std::string>&& colorList) : colorList(std::move(colorList)) {}

...但这对你来说可能太高级了。

【讨论】:

  • 简洁透彻,不错!
  • 是的,我想省略初始化列表、constexpr、noexcept 等内容。他是个初学者。
  • 谢谢,但这不是我可以用于我的作业的东西,因为我不允许使用我还没有学到的东西:0 如果我使用另一种方法......就像一个char 指针或字符串数​​组,我需要从我的代码中更改什么?我上传了我现在的,你能给我一些建议吗?非常感谢!!!
  • @Gah 我为你感到难过。看来你的老师不好。
【解决方案2】:

所以看看你的代码你有一些错误。取Menu构造函数

Menu::Menu(const char* menuTitle, const char* items[], int numItems) {
    m_menuTitle = new char[strlen(menuTitle) + 1];
    strcpy_s(m_menuTitle, strlen(menuTitle) + 1, menuTitle);
    for (int i = 0; i < numItems; i++) {
        m_items[i] = &items[i];
    }
    m_numItems = numItems;
}

您已经正确处理了菜单标题,现在您应该在菜单项上使用相同的想法。那就是你用new分配每个菜单项,然后用strcpy_s复制每个菜单项。像这样

Menu::Menu(const char* menuTitle, const char* items[], int numItems) {
    m_menuTitle = new char[strlen(menuTitle) + 1];
    strcpy_s(m_menuTitle, strlen(menuTitle) + 1, menuTitle);
    for (int i = 0; i < numItems; i++) {
        m_items[i] = new char[strlen(items[i]) + 1];
        strcpy_s(m_items[i], strlen(items[i]) + 1, menuTitle);
    }
    m_numItems = numItems;
}

看到了吗?除了m_items[i] 替换了m_menuTitle 之外,它与您已经拥有的并没有什么不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2023-03-17
    相关资源
    最近更新 更多