以下是股票来源的实施文件的片段:
stock::stock(char const * const symbol, char const * const name, int sharePrice, date priceDate )
: m_sharePrice( sharePrice )
{
if ( symbol )
{
size_t length = strlen( symbol ) +1;
m_symbol = new char[length];
strcpy_s( m_symbol, length, symbol );
}
else m_symbol = NULL;
if ( name )
{
size_t length = strlen( name ) +1;
m_name = new char[length];
strcpy_s( m_name, length, name );
}
else m_name = NULL;
dateObj = &priceDate;
}
这就是我用cstrings分配内存的方法。在主要的情况下,参数传递的方式类似于“符号”,名称“,10,date :: JANUARY,19,1677。日期是一个对象,其中的月份是enumaterted。这是最后一个参数”日期“类型是什么iim当我从一个源文件移动到下一个源文件时,我无法保留属性。我看到在上面的函数中,“dateObj”具有我需要的属性。但是当我将它转移到另一个源文件时价值观已经消失......
pragma once
#include <ostream>
using namespace std;
class date
{
public:
typedef enum {INVALID, JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER,DECEMBER}
Month;
date(Month month, int day, int year);
date(const date& date); // copy constructor
date(void); // default constructor
~date(void);
friend ostream& operator<<(ostream& out, const date& d);
private:
Month month;
int day;
int year;
};
因此,当我需要添加到hashTable时,反之亦然,我最终得到了可怜的值。
bool hashmap::get(char const * const symbol, stock& s) const
{
int index = 0;
// search for the stock associated with the symbol.
while ( index < maxSize )
{
if ( hashTable[index].m_symbol == NULL )
{
index++;
}
else if ( strcmp( symbol, hashTable[index].m_symbol ) == 0 )
{
//s = *hashTable; // call assignemnt overload
s.m_name = hashTable[index].m_name; // has correct value
s.dateObj = hashTable[index].dateObj; // GARBLE!
s.m_sharePrice = hashTable[index].m_sharePrice; // correct
s.m_symbol = hashTable[index].m_symbol; // correct
return true;
}
}
return false;
}
也许如果我可以在其中一个头文件中添加内容以使其更容易。
#include "date.h"
using namespace std;
class stock
{
public:
stock(char const * const symbol, char const * const name, int sharePrice, date priceDate);
stock(const stock& s); // copy constructor
stock(void); // default constructor
char const * const getSymbol(void) const;
stock& operator=(const stock& s);
stock& operator=(stock const * const s);
~stock(void);
// display column headers
static void displayHeaders(ostream& out);
friend ostream& operator<<(ostream& out, const stock& s);
friend class hashmap;
private:
date *dateObj;
char *m_symbol;
char *m_name;
int m_sharePrice;
static int maxSize;
};
#include "stock.h"
class hashmap
{
public:
hashmap(int capacity);
~hashmap(void);
bool get(char const * const symbol, stock& s) const;
bool put(const stock& s, int& usedIndex, int& hashIndex, int& symbolHash);
bool remove(char const * const symbol);
friend ostream& operator<<(ostream& out, const hashmap& h);
private:
static int hashStr(char const * const symbol);
friend class stock;
stock *hashTable;
};
这可能是我可以解决日期属性不保持其值的问题。我只是不确定在哪里做什么。
#include "date.h"
date::date(Month month, int day, int year)
{
this->month = month;
this->day = day;
this->year = year;
}
date::date(const date& date)
{
}
date::date()
{
day = this->day;
year = this->year;
month = this->month;
}
date::~date(void)
{
}
ostream& operator<<(ostream& out, const date& d)
{
out << d.day << d.month << d.year << endl;
return out;
}
答案 0 :(得分:7)
stock::stock(/* snip */ date priceDate ) : m_sharePrice( sharePrice ) { /* Snip */ dateObj = &priceDate; }
不要那样做。 priceDate
是堆栈中的一个参数。一旦构造函数结束,&priceDate
就会变成陈旧的指针。考虑实际复制对象(而不是使用指针,例如声明date dateObj;
并指定dateObj = priceDate;
)
答案 1 :(得分:2)
那些日期构造函数看起来不对。 no-args或copy构造函数都没有实际初始化任何字段。