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

如何使用对象指针数组访问类中的成员变量?

解决类成员指针访问的问题

嘿,我看到你刚接触指针,在访问类成员的时候遇到了麻烦,咱们一步步拆解问题,把你的国际象棋走法数据库程序给弄好~

首先,你的代码里有两个核心问题,直接导致了程序没有输出甚至可能崩溃:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:03:39