C++将常量字符* 指针数组传递给对象
C++ pass const char* pointer array to object
亲爱的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's
构造函数:
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 特征,允许结构的最后一个成员是不同大小的数组(例如,参见未知大小的数组/灵活数组成员(。但是,支持在函数中具有const char* x[]
类型的参数,并且其含义与const char** x
基本相同。
如果您坚持使用类型const char**
的成员,则必须处理该类中的内存管理。这意味着:负责该类的分配、解除分配、复制、移动、复制分配和移动分配对象(例如,参见 0/3/5 规则(。
如果 - 如评论中所建议的 - 您使用标准库馆藏,例如std::vector
,这些类将以可靠的方式为您完成所有这些工作。请参阅以下示例,说明两者之间的区别:
请注意,C++ 版本可能甚至不会采用const char*[]
-参数,而是直接采用const std::vector<const char*> &x
参数。但我在构造函数中保留了const char*[]
-参数,以便在两种变体中提供相同的接口:
// 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();
}
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组