c++ - 在类中操作 vector 时遇到问题

标签 c++ class pointers vector reference

我需要定义一个测试模式 vector ,然后我可以通过各种方法操纵它的值。

下面是我如何定义 TestMode 类:

class TestMode{
public:
    TestMode(int val, int jamramaddr){
        value=val;
        jamramaddress=jamramaddr;
    }
    int getAddr(void){
        return jamramaddress;
    }
    void setValue(int val){
        value=val;
    }
    int getValue(void){
        return value;
    }
private:
    int value;
    int jamramaddress;
};

非常简单。

然后我有一个 TestModeGroup 类来对我创建的测试模式 vector 执行操作。该类看起来像这样:

class TestModeGroup{
public:
    TestModeGroup(const std::vector<TestMode> &TestModes){
        TestModeVector=TestModes;
    }
    //Compare the given jamramaddress against the known jamramaddress of the given testmode. If it is a match then update the testmode value
    void compareAndStore(TestMode &TM){
        int TM_address=TM.getAddr();
        if(TM_address==JamRamAddress){
            output("Match found! Old TM value %d", TM.getValue());
                TM.setValue(JamRamData);
            output("New TM value %d", TM.getValue());
        }
    }
    //Commit the given testmode to the jamram with the latest known value
    void writeTmBitToJamRam(TestMode &TM){
        JamRamAddress=TM.getAddr();
        JamRamData=TM.getValue();
        apg_jam_ram_set(JamRamAddress,JamRamData);
    }
    //running TestModeGroupObject.store(address, data) will find which test mode that jamram address is for and set the appropriate test mode value for later printing.
    //This is meant to be used in conjuction with the Excel spreadsheet method of entering test modes
    void store(int address, int data){
            JamRamAddress= address;
            JamRamData   = data;
            output("Current JamRamAddress = %d JamRamData = %d", JamRamAddress, JamRamData);
            apg_jam_ram_set(JamRamAddress,JamRamData);
            for(std::vector<TestMode>::iterator it = TestModeVector.begin(); it!=TestModeVector.end(); ++it){
                compareAndStore(*it);
            }
    }
    //Running TestModeGroupObject.load() will commit all test mode changes to the jamram for test modes that are part of that object
    void load(void){
            for(std::vector<TestMode>::iterator it = TestModeVector.begin(); it!=TestModeVector.end(); ++it){
                writeTmBitToJamRam(*it);
            }
    }
    int getTMVal(TestMode &TM){
        return TM.getValue();
    }
private:
    int JamRamAddress;
    int JamRamData;
    std::vector<TestMode> TestModeVector;
};

这是我定义 vector 的方式:

TestMode adm_testmodes[] = {TM_TWINWL,TM_TWINBL,ON_2WL,ON_2BL,WV_S1X,WV_S0X,TM_PCHG_RH_3,TM_PCHG_RH_2,TM_PCHG_RH_1,TM_PCHG_RH_0,TM_PCHG_RH_BYP,TM_PCHG_SF_3,TM_PCHG_SF_2,TM_PCHG_SF_1,TM_PCHG_SF_0,TM_PCHG_SF_BYP,
    TM_PCHG_V04_3,TM_PCHG_V04_2,TM_PCHG_V04_1,TM_PCHG_V04_0,TM_PCHG_V04_BYP,TM_SA_DIS,TM_TS_NEGSLOPE,TM_TRIM_4,TM_TRIM_3,TM_TRIM_2,TM_TRIM_1,TM_TRIM_0,TM_TSSLP_2,TM_TSSLP_1,TM_TSSLP_0,
    TM_WRV_N_2,TM_WRV_N_1,TM_WRV_N_0,TM_SAGAIN_EN,TM_REFTRIM_EN,TM_READ_DONE_OPT_EN,EnableCore_Read,SA_4,TM_OC_2,TM_OC_1,TM_OC_0,TM_WRLC_4,TM_WRLC_3,TM_WRLC_2,TM_WRLC_1,TM_WRLC_0,
    TM_WRHC_4,TM_WRHC_3,TM_WRHC_2,TM_WRHC_1,TM_WRHC_0,TM_FTOP_3,TM_FTOP_2,TM_FTOP_1,TM_FTOP_0,TM_RISE_1,TM_RISE_0,TM_WRH_3,TM_WRH_2,TM_WRH_1,TM_WRH_0,TM_SET_4,TM_SET_3,TM_SET_2,TM_SET_1,TM_SET_0,
    TM_REFSTART,TM_REFSEL_1,TM_REFSEL_0,TM_REFSL_5,TM_REFSL_4,TM_REFSL_3,TM_REFSL_2,TM_REFSL_1,TM_REFSL_0,TM_REFSH_5,TM_REFSH_4,TM_REFSH_3,TM_REFSH_2,TM_REFSH_1,TM_REFSH_0,TM_READ_DONE_ADD,
    TM_READ_DONE_OPT,TM_READ_DONE_5,TM_READ_DONE_4,TM_READ_DONE_3,TM_SAGAIN_1,TM_SAGAIN_0,TM_REFR_5,TM_REFR_4,TM_REFR_3,TM_REFR_2,TM_REFR_1,TM_REFR_0   
};

std::vector<TestMode> ADM_TMs (adm_testmodes, adm_testmodes + sizeof(adm_testmodes) / sizeof(TestMode));

TestModeGroup ADM_TestModeGroup(ADM_TMs);

到目前为止一切顺利。我可以直接访问所有已定义的 TestModes,更改值并让该更改随处可见。当我尝试在 TestModeGroup 类中运行“存储”功能时,问题就来了。似乎我有更新的 TestModes 的本地拷贝,但不是原始的 TestMode。我确信这是一个非常简单的问题,但我正在努力。 C++ 不是我的专长,OOP 更不是。

这是我创建的虚拟测试模式的一个简单示例:

output("DUMMY_TESTMODE Initial Value: %d", DUMMY_ADM_TestModeGroup.getTMVal(DUMMY_TESTMODE));
DUMMY_TESTMODE.setValue(1);
output("DUMMY_TESTMODE Set to 1 Value: %d", DUMMY_ADM_TestModeGroup.getTMVal(DUMMY_TESTMODE));
DUMMY_TESTMODE.setValue(0);
output("DUMMY_TESTMODE Set to 0 Value: %d", DUMMY_ADM_TestModeGroup.getTMVal(DUMMY_TESTMODE));
DUMMY_ADM_TestModeGroup.store(22,1);
output("DUMMY_TESTMODE Set to 1 Value: %d", DUMMY_ADM_TestModeGroup.getTMVal(DUMMY_TESTMODE));

执行 .setValue 工作正常,但执行 .store 则不行。当我打印出该值时,它返回为 0。不过,在 .store 函数中,我做了一个打印输出,并给出了正确的值 1。不知何故,我认为我只是在更改原始 vector 的拷贝,但我只是想不通。我一直快把自己逼疯了,而与我交谈过的人对 C++ 的了解都不足以提供帮助。有人知道我哪里搞砸了吗?

最佳答案

尝试更改 TestModeGroup 类:

class TestModeGroup{
public:
    TestModeGroup(const std::vector<TestMode> &TestModes) : TestModeVector(TestModes)
    {}

    // ...

    std::vector<TestMode> & TestModeVector;
};

如果您希望将在类内部完成的 vector 修改应用于传递给构造函数的原始值,则需要存储对原始对象的引用。让我知道这是否有帮助:)

关于c++ - 在类中操作 vector 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20432502/

相关文章:

java - 使用带有数组的类时遇到问题

javascript - 如何在 JavaScript 中命名匿名对象?

c++ - 是否可以将函数指针保存在 std::vector 中?

c - 将指针传递给指针并重新分配空间

c++ - [in]、[out]、[in, out] 和 [out, retval] 之间有什么区别?

c++ - SDL2 和 OpenGL 模板缓冲区不起作用

jquery - 为一项事件分配多个类(class)

c++ - C++如何从链表中选择随机项目

c++ - 从 C++ 向服务发送命令

c++ - 对使用从 C++ 文件中读取的值有帮助吗?