如何在C++中创建对象数组并在内存分配后访问对象字符串?[关闭]

2sbarzqh  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(109)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
3天前关闭。
Improve this question
现在我正在写newObjectArray(int size)printTitles(Container *pArr, int size)函数的代码,用size元素动态分配数组内存,存储在pArr中打印size字,在pArr[]的每个元素对象的标题中输入并保存后,pArr[]的所有对象的标题都应该是输出。
printTitles(Container *pArr, int size)
在创建这个函数的过程中,我一直遇到问题。准确地说是cout << pArr[i]->title
这部分给出了操作符->->*应用于“Container”而不是指针类型的错误。如何接近并打印对象数组中的字符串?
我应该得到这个作为输出。
我输入 3,3,abc de f,它应该输出abc de f

menu? 3
element numbers of Container array[]? 3
Container(): arr = nullptr; size = 0;
Container(): arr = nullptr; size = 0;
Container(): arr = nullptr; size = 0;
input 3 words: abc de f
words: abc de f

这是我写的代码,还没有完成。我试着用pArr[i].title替换pArr[i]->title,但这给了我一个不同的错误。
当我这样做时,我得到的错误是 Cannot access member“Container::title”。这就是错误。而在newobjectArray()中为什么是Container * pArr = nullptr;。我想知道是否需要此代码。此代码是从问题开始就存在的代码。

#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];
        // 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 = nullptr; 
    Container *pArr1 = new Container [size];
    string tmp;
    cout << "input 3 words: ";
    for (int i = 0; i < size; i++) {
        cin >> tmp;
        pArr1[i].setTitle(tmp);
    }
    pArr = pArr1;
    return pArr;
}

void printTitles(Container *pArr, int size) {
    cout << "words: ";
    for (int i = 0; i < size; i++)
        cout << pArr[i]->title
}

void objectArray() {
    Container *pArr; 
    int size;       
    cout << "element numbers of Container array[]? ";
    cin >> size;
    pArr = newObjectArray(size);
    printTitles(pArr, size);
}

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

nnsrf1az1#

pArr[i]给你一个索引为i的对象,这不是一个指针。所以你必须使用.而不是->。此外,title是私有的,尝试getTitle()代替。
你可能想要这样的东西:

void printTitles(Container *pArr, int size) {
    cout << "words: ";
    for (int i = 0; i < size; i++)
        cout << pArr[i].getTitle();
}

另外,如果你想存储 words,比如字符串,那么就使用std::string(它也会为你处理大小)。
int *arr;int size;可以很好地用于数字数组,但也可以考虑使用std::vector<int> list;

相关问题