1

首先,这是针对一个类的,所以我们能做什么和不能做什么是有限制的,而且我对 c++ 和一般编程非常陌生,所以这就是为什么代码可能有点垃圾的原因。

我想尽办法理解为什么当我在第一个 for 循环中使用第一组 cout 行显示 item_list 时,它会按原样显示每个单独的项目(它是天际成分及其效果的列表)。

然而,当第二个 for 循环执行时,item_list 只填充了应该插入的最后一项(wisp wrappings 及其效果)。

即使只是将我指向正确的方向也会非常感激:)

干杯

int client::fill_list(int size_in, int h1size, int h2size)
{
    char temp[ASIZE] = {'\0'};
    int j = 0;
    ifstream ifile;
    ifile.open("test.txt");

    if(ifile.is_open())
    {
        for(int i = 0; i < size_in; ++i)
        {    
            if(ifile.good())
            {       
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.name, temp, j);
            }


            if(ifile.good())
            {
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.effect1, temp, j);
            }

            if(ifile.good())
            {
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.effect2, temp, j);
            }

            if(ifile.good())
            {
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.effect3, temp, j);
            }

            if(ifile.good())
            {
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.effect4, temp, j);
            }
            reference.into_list(i,client_item);
        cout << reference.item_list[i].name;
        cout << reference.item_list[i].effect1;
        cout << reference.item_list[i].effect2;
        cout << reference.item_list[i].effect3;
        cout << reference.item_list[i].effect4;
        getchar();
        }
    }
    for(int k = 0; k < SIZE; ++k)
    {
        cout << reference.item_list[k].name;
        cout << reference.item_list[k].effect1;
        cout << reference.item_list[k].effect2;
        cout << reference.item_list[k].effect3;
        cout << reference.item_list[k].effect4;
    }
    getchar();
    return 0;
}

...

int table::into_list(int index, item&item_in)
{
    if(index < SIZE)
    {
        item_list[index] = item_in;
        return 0;
    }
    else
        return 1;
}

...表类的标题

#include "hash.h"

class table
{
public:
    table()
    {
        item_list = new item [SIZE];
    }
    ~table();
    int fill(item*);
    int insert(item&, nHash&);
    int insert(item&, eHash&, int);
    int retrieve(char*,item*,int);
    int remove(int,item&);
    int remove(int);
    int check_hash(int,int,int);
    int keygen(char*, int);
    int from_list(int, item&);
    int into_list(int, item&);

//private:
    item * item_list;
    nHash name_table;
    eHash ef1_table;
    eHash ef2_table;
    eHash ef3_table;
    eHash ef4_table;
};

....主要的开始

#include "client.h"

int main()
{
    client program;

    program.fill_list(SIZE,HNSIZE,HESIZE);

    for(int i = 0; i < SIZE; ++i)
    {
        cout << program.reference.item_list[i].name;
        cout << program.reference.item_list[i].effect1 << endl;
        cout << program.reference.item_list[i].effect2 << endl;
        cout << program.reference.item_list[i].effect3 << endl;
        cout << program.reference.item_list[i].effect4 << endl;
    }

……

项目标题

#include <iostream>
#include <fstream>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <cmath>

using namespace std;

const int ASIZE = 30;
const int SIZE = 92;
const int HNSIZE = 41;
const int HESIZE = 17;

struct item
{
    item();
    ~item();
    char * name;
    char * effect1;
    char * effect2;
    char * effect3;
    char * effect4;
    int count;
    //int keygen(int,int);
    /*int name_key;
    int ef1_key;
    int ef2_key;
    int ef3_key;
    int ef4_key;*/
};
4

1 回答 1

4

问题的一部分可能是您如何在client_item此处复制:

reference.into_list(i,client_item);

这只是分配client_itemitem_list这样的:

item_list[index] = item_in;

...但是因为item是这样定义的:

struct item
{
    item();
    ~item();
    char * name;
    char * effect1;
    ...

...所有items in都将具有指向与 in 内存相同的内存的item_list指针(如等) 。 nameclient_item

例如,每次赋值后,指针item_list[index].nameitem_in.name将具有相同的值。(如果您好奇,可以通过打印两个指针来检查。)由于它们都指向同一个内存,如果您更改存储在该内存中的内容,两个对象似乎会同时更改。

这意味着后续的更改client_item——比如将新字符串复制到它指向的位置之一——也会影响所有保存的项目。

于 2012-05-18T19:07:26.493 回答