如何使用对象指针数组访问类中的成员变量?
解决类成员指针访问的问题
嘿,我看到你刚接触指针,在访问类成员的时候遇到了麻烦,咱们一步步拆解问题,把你的国际象棋走法数据库程序给弄好~
首先,你的代码里有两个核心问题,直接导致了程序没有输出甚至可能崩溃:
1. 未初始化的野指针
你声明了moves* possibleMoves[100];,这是一个能存100个moves指针的数组,但数组里的每个指针都是野指针——它们没有指向任何有效的moves对象。直接用possibleMoves[0]->piece去访问成员,属于访问非法内存,这会触发「未定义行为」,程序可能直接崩溃,或者执行到一半就停了,自然不会有输出。
解决方法是给指针分配实际的对象,用new关键字创建一个moves实例:
possibleMoves[0] = new moves(); // 让指针指向一个有效的moves对象
2. 错误的赋值和输出写法
你写的赋值语句&(possibleMoves[0]->piece) = 100;完全是错误的:
possibleMoves[0]->piece已经是一个int类型的成员变量,直接赋值就行,不需要取地址(&)- 取地址后得到的是
int*类型,不能直接给它赋值100
同样,输出语句*&possibleMoves[0]->piece里的*和&是互相抵消的,完全多余,直接访问成员变量即可。
修正后的完整代码
main.cpp
#include <iostream> #include "moves.h" using namespace std; int main() { moves* possibleMoves[100]; // 初始化第一个指针,指向新创建的moves对象 possibleMoves[0] = new moves(); // 直接给成员变量赋值 possibleMoves[0]->piece = 100; // 直接输出成员变量 cout << possibleMoves[0]->piece << endl; // 记得释放内存,避免内存泄漏 delete possibleMoves[0]; return 0; }
moves.h(这个文件没问题,保持原样即可)
#ifndef MOVES_H #define MOVES_H class moves { public: moves(); int piece; int X; int Y; int addX; int addY; int score; }; #endif // MOVES_H
额外的小建议
如果你担心手动管理内存(new/delete)容易出错,可以用C++的智能指针,比如std::unique_ptr,它会自动帮你释放内存,避免内存泄漏:
#include <memory> // 需要包含这个头文件 // 把数组改成智能指针数组 std::unique_ptr<moves> possibleMoves[100]; // 创建对象 possibleMoves[0] = std::make_unique<moves>(); // 访问成员的方式和普通指针一样 possibleMoves[0]->piece = 100; // 不需要手动delete,智能指针会自动处理
这样修改后,程序就能正常输出100啦~
内容的提问来源于stack exchange,提问作者Richard Escobia
相关产品推荐
相关产品推荐

