C++ 将 const char* 指针数组传递给对象

标签 c++ string parameter-passing

亲爱的 StackOverFlowers,

我在将 const char* [] 传递给对象时遇到问题。场景如下。

我有一个 class UlamScreen,它包含一个带有多个字符串的 const char* []UlamScreen 还包含一个对象 homeScreenMenu

class UlamScreen {
  const char* homeScreenText[5] = {"EVA dun", "Sabine", "TPU dun", "test Wout", 
  UlamScreenMenu homeScreenMenu;
};

class UlamScreenMenu {    
private:
  const char* _menuText[];

public:
  UlamScreenMenu(const char*[]);
  void drawMenu();
};

我想将 const char* [] 传递给 UlamScreenMenu 以便我可以在名为 void drawMenu 的成员函数中使用它,例如这个:

void UlamScreenMenu::drawMenu() {
  for (int i = 0; i < menuItems; i++) {
      tft.println(_menuText[i]);
  }
}

我像这样将它传递给 UlamScreenMenu 的 构造函数:

UlamScreen::UlamScreen() : homeScreenMenu(homeScreenText) {

}

UlamScreenMenu::UlamScreenMenu(const char* menuText[], int length) {
  for(int i = 0; i < length; i++) {
    _menuText[i] = menuText[i];
  }
}

我认为这会起作用,但由于某些原因,它不起作用。 tft.println(_menuText[i]);void drawMenu 一起使用不会向我的 tft 屏幕发送任何内容。当我在 UlamScreen 类中使用 tft.println(_menuText[i]); 时,它工作得很好。

需要说明的是,我可以在 UlamScreenMenu 类中使用 tft 对象,因为 tft.drawRect() 等其他函数正在运行正确。

这种传递 const char* [] 的方式有什么问题?提前致谢。

最佳答案

在 C++ 中,您不能声明 const char* x[] 类型的成员变量,因为这将表示一个灵活的数组成员。灵活的数组成员是一个 C 特性,允许结构的最后一个成员是不同大小的数组(例如,参见 Arrays of unknown size / flexible array members )。具有 const char* x[] 类型的参数然而,在函数中,它是受支持的,并且与 const char** x 具有基本相同的含义。 .

如果您坚持使用 const char** 类型的成员,那么您将不得不在该类中处理内存管理。这意味着:负责该类的分配、取消分配、复制、移动、复制分配和移动分配对象(例如,参见 the rule of 0/3/5)。

如果 - 正如评论中所建议的那样 - 您使用标准图书馆馆藏,例如std::vector ,这些类(class)将以可靠的方式为您完成所有这些工作。请参阅以下示例,说明两者之间的区别:

请注意,C++ 版本可能甚至不需要 const char*[]。 -parameter 但直接一个 const std::vector<const char*> &x -范围。但我保留了 const char*[] -构造函数中的参数以在两种变体中提供相同的接口(interface):

// Variant 1: "old" C-style:
class Menu {
public:

    Menu(const char* x[], int length) {
        m_x = new const char*[length];
        m_length = length;
        for (int i=0; i<length; i++) {
            m_x[i] = x[i];
        }
    }

    ~Menu() {
        delete[] m_x;
    }

    // TODO: implement copy- and move constructors + copy- and move assignments
    // ...

    void print() {
        for (int i=0; i<m_length; i++) {
            std::cout << m_x[i] << std::endl;
        }
    }

private:
    const char** m_x = nullptr;
    int m_length;
};

#include <vector>

// Variant 2: a C++- way:
class Menu2 {
public:
    Menu2(const char* x[], int length) {
        m_x.assign(x, x+length);
    }

    void print() {
        for (auto s : m_x) {
            std::cout << s << std::endl;
        }
    }

    // Menu2 does not manage memory on its own, hence:
    // No special copy/move - constructors/assignments to be implemented.
    // No special destructor necessary
private:

    std::vector<const char*> m_x;
};

int main() {
    const char* x1[3] = {"one","two","three" };
    const char* x2[2] = {"eins","zwei" };

    // Variant 1
    Menu m1(x1, 3);
    m1.print();

    // Variant 2
    Menu2 m2(x2, 2);
    m2.print();
}

关于C++ 将 const char* 指针数组传递给对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52138940/

相关文章:

c - 将 typedef 枚举初始化为字符串

python - 无法将参数传递给 XGBoost

python - 如何在类型提示中定义元组或列表的大小

c++ - Eigen:log() 的计算限制是什么? (Windows 与 Linux)

c++ - 为什么 mersenne_twister_engine 保证某些结果?

python - swig,传递没有指定尺寸的 carrays

ruby-on-rails - Rails 中单击按钮时传递参数

c++ - 这个 8 Queen 程序有什么错误?

java - 使用SplitString分隔输入句子并根据字母降序排序

php - PHP 中的 'eq' 和 '==' 有什么区别?