C++创建对象数组及访问对象字符串的问题排查与解决
问题解决与代码修正
核心问题分析与修复
1. printTitles函数的双重错误
->运算符错误:pArr是指向Container数组的指针,pArr[i]等价于*(pArr+i),是一个**Container对象**而非指针,因此必须用.运算符访问成员,而非->。- 无法访问
Container::title:title是Container类的私有成员,类外部不能直接访问,必须通过类提供的公共接口getTitle()获取。
修正后的printTitles函数:
void printTitles(Container *pArr, int size) { cout << "words: "; for (int i = 0; i < size; i++) { if (i > 0) cout << " "; // 添加空格分隔,匹配期望输出格式 cout << pArr[i].getTitle(); } cout << endl; }
2. newObjectArray中Container *pArr = nullptr;的必要性
完全没必要。这段代码中pArr只是冗余的中间变量,直接将new Container[size]的结果赋值给指针并返回即可,优化后的函数:
Container *newObjectArray(int size) { Container *pArr = new Container[size]; string tmp; cout << "input " << size << " words: "; // 改为动态匹配size,而非固定"3 words" for (int i = 0; i < size; i++) { cin >> tmp; pArr[i].setTitle(tmp); } return pArr; }
3. 内存泄漏修复
动态分配的Container数组使用完毕后必须释放,否则会造成内存泄漏。在objectArray函数中添加释放逻辑:
void objectArray() { Container *pArr; int size; cout << "element numbers of Container array[]? "; cin >> size; pArr = newObjectArray(size); printTitles(pArr, size); delete[] pArr; // 释放动态分配的数组内存 }
完整修正代码
#include <iostream> #include <string> using namespace std; /****************************************************************************** * class Container ******************************************************************************/ class Container { string title; int size; int *arr; public: Container(); ~Container(); void setTitle(string title); string getTitle(); void newIntArray(); void newArray(); void average(); void rightRotateTitle(); void findDeleteTitle(); void inputIntArray(); }; Container::Container() { arr = nullptr; size = 0; cout << "Container(): arr = " << arr << "; size = " << size << ";" << endl; } Container::~Container() { cout << "~Container(): arr[" << size << "] deleted;" << endl; } void Container::setTitle(string title) { this->title = title; } string Container::getTitle() { return title; } void Container::newIntArray() { cout << "element numbers of int array[]?"; cin >> size; } void Container::inputIntArray() { cout << "input " << size << " integers: "; int *arr = new int [size]; if (arr==NULL) { cout << "error" << endl; return; } for (int i = 0; i < size; i++) cin >> arr[i]; cout << "arr[" << size << "]: "; for (int i = 0; i < size; i++) cout << arr[i] << " "; cout << endl; delete [] arr; } /****************************************************************************** * Global functions ******************************************************************************/ void constructor() { Container c; c.setTitle("constructor-title"); cout << "c.getTitle(): " << c.getTitle() << endl; } void intArray() { Container c; c.newIntArray(); c.inputIntArray(); //c.average(); } Container *newObjectArray(int size) { Container *pArr = new Container[size]; string tmp; cout << "input " << size << " words: "; for (int i = 0; i < size; i++) { cin >> tmp; pArr[i].setTitle(tmp); } return pArr; } void printTitles(Container *pArr, int size) { cout << "words: "; for (int i = 0; i < size; i++) { if (i != 0) cout << " "; cout << pArr[i].getTitle(); } cout << endl; } void objectArray() { Container *pArr; int size; cout << "element numbers of Container array[]? "; cin >> size; pArr = newObjectArray(size); printTitles(pArr, size); delete[] pArr; // 释放内存 } void inputTitle(Container* cp) { string s; getline(cin, s); } void rotateTitle() { } void findDelete() { } /****************************************************************************** * main() ******************************************************************************/ string menuStr = "******************************** Main Menu *********************************\n" "* 0.Exit 1.constructor 2.intArray 3.objectArray 4.rotateTitle 5.findDelete *\n" "****************************************************************************\n"; int main() { while (true) { int menuItem; cout << endl << menuStr << "menu? "; cin >> menuItem; if (menuItem == 0) break; switch(menuItem) { case 1: constructor(); break; case 2: intArray(); break; case 3: objectArray(); break; case 4: rotateTitle(); break; case 5: findDelete(); break; } } cout << "Good bye!!" << endl; }
测试验证
输入流程:
- 选择菜单选项
3 - 输入
3(Container数组元素个数) - 输入
abc de f(三个单词)
输出结果:
element numbers of Container array[]? 3 Container(): arr = 0; size = 0; Container(): arr = 0; size = 0; Container(): arr = 0; size = 0; input 3 words: abc de f words: abc de f ~Container(): arr[0] deleted; ~Container(): arr[0] deleted; ~Container(): arr[0] deleted;
内容的提问来源于stack exchange,提问作者Seungjea lee
相关产品推荐
相关产品推荐

