You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

测试验证

输入流程:

  1. 选择菜单选项3
  2. 输入3(Container数组元素个数)
  3. 输入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:17:38